第03章 MySQL基本的SELECT语句

第03章 MySQL基本的SELECT语句

1. SQL概述

1.1 SQL背景知识

  • 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩荡的波动里,有一门技术从未消失,甚至”老当益壮”,那就是 SQL。
  • 45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言, SQL 的半衰期可以说是非常长了。
  • 前端工程师和后端算法工程师都必须处理数据,需要知道如何快速准确地提取他们想要的数据。更不用说数据分析师了,他们的工作就是处理数据并组织不同的报告来指导商业决策。
    [En]

    both front-end engineers and back-end algorithm engineers must deal with data and need to know how to extract the data they want quickly and accurately. Not to mention data analysts, whose job is to deal with data and organize different reports to guide business decisions.*

  • SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言, 与数据直接打交道,由 IBM上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有 SQL-86SQL-89SQL-92SQL-99等标准。
  • SQL 有两个重要的标准,分别是 SQL92 和 SQL99,它们分别代表了 92 年和 99 年颁布的 SQL 标准,我们今天使用的 SQL 语言依然遵循这些标准。
  • 不同的数据库生产厂商都支持SQL语句,但都有特有内容。

第03章 MySQL基本的SELECT语句

1.2 SQL语言排行榜

自从 SQL 加入了 TIOBE 编程语言排行榜,就一直保持在 Top 10。

第03章 MySQL基本的SELECT语句

1.3 SQL 分类

SQL语言在功能上主要分为如下3大类:

  • DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
  • 主要的语句关键字包括 CREATEDROPALTER等。
  • DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。
  • 主要的语句关键字包括 INSERTDELETEUPDATESELECT等。
  • SELECT是SQL语言的基础,最为重要。
  • DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
  • 主要的语句关键字包括 GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。
还有单独将 COMMITROLLBACK 取出来称为TCL (Transaction Control Language,事务控制语言)。

2. SQL语言的规则与规范

2.1 基本规则

  • SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  • 每条命令以 ; 或 \g 或 \G 结束
  • 关键字不能缩写或分支
    [En]

    keywords cannot be abbreviated or branched*

  • 关于标点符号
  • 必须保证所有的()、单引号、双引号是成对结束的
  • 必须使用英文状态下的半角输入方式
  • 字符串型和日期时间类型的数据可以使用单引号(’ ‘)表示
  • 列的别名,尽量使用双引号(” “),而且不建议省略as

2.2 SQL大小写规范 (建议遵守)

  • MySQL 在 Windows 环境下是大小写不敏感的
  • MySQL 在 Linux 环境下是大小写敏感的
  • 数据库名、表名、表的别名、变量名是严格区分大小写的
  • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
  • 推荐采用统一的书写规范:
  • 数据库名、表名、表别名、字段名、字段别名等都小写
  • SQL 关键字、函数名、绑定变量等都大写

2.3 注 释

您可以使用以下格式的批注结构

[En]

You can use the annotation structure in the following format

单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字  */

2.4 命名规则(暂时了解)

  • 数据库、表名不得超过30个字符,变量名限制为29个
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 不在数据库名称、表名、字段名和其他对象名中包含空格
    [En]

    do not include spaces in database names, table names, field names and other object names*

  • 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用(着重号)引起来</li> <li>保持字段名称和类型的一致性,并确保命名字段和分配数据类型时的一致性。如果一个表中的数据类型为整数,则不要成为另一个表中的字符。<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> keep the consistency of field names and types, and be sure to ensure consistency when naming fields and assigning them data types. If the data type is an integer in one table, don't become a character in another table.</font>*</details></li> </ul> <p>举例:</p> <pre><code class="language-mysql">#以下两句是一样的,不区分大小写 show databases; SHOW DATABASES; #创建表格 #create table student info(...); #表名错误,因为表名有空格 create table student_info(...); #其中order使用飘号,因为order和系统关键字或系统函数名等预定义标识符重名了 CREATE TABLE ( id INT, lname VARCHAR(20) ); select id as "编号", as "姓名" from t_stu; #起别名时,as都可以省略 select id as 编号, as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略"" select id as 编 号, as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略"" </code></pre> <h3>2.5 数据导入指令</h3> <p>在命令行客户端登录mysql,使用source指令导入</p> <pre><code class="language-mysql">mysql> source d:\mysqldb.sql </code></pre> <pre><code class="language-mysql">mysql> desc employees; +----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-------------+------+-----+---------+-------+ | employee_id | int(6) | NO | PRI | 0 | | | first_name | varchar(20) | YES | | NULL | | | last_name | varchar(25) | NO | | NULL | | | email | varchar(25) | NO | UNI | NULL | | | phone_number | varchar(20) | YES | | NULL | | | hire_date | date | NO | | NULL | | | job_id | varchar(10) | NO | MUL | NULL | | | salary | double(8,2) | YES | | NULL | | | commission_pct | double(2,2) | YES | | NULL | | | manager_id | int(6) | YES | MUL | NULL | | | department_id | int(4) | YES | MUL | NULL | | +----------------+-------------+------+-----+---------+-------+ 11 rows in set (0.00 sec) </code></pre> <h2>3. 基本的SELECT语句</h2> <h3>3.0 SELECT...</h3> <pre><code class="language-mysql">SELECT 1; #没有任何子句 SELECT 9/2; #没有任何子句 </code></pre> <h3>3.1 SELECT ... FROM</h3> <ul> <li>语法:</li> </ul> <pre><code class="language-sql">SELECT 标识选择哪些列 FROM 标识从哪个表中选择 </code></pre> <ul> <li>选择全部列:</li> </ul> <pre><code class="language-sql">SELECT * FROM departments; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140339180-1274467332.png" /></p> <blockquote> <p>一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符'*'。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获取它们。 在生产环境下,不推荐你直接使用 <code>SELECT *</code>进行查询。</p> </blockquote> <ul> <li>选择特定的列:</li> </ul> <pre><code class="language-sql">SELECT department_id, location_id FROM departments; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140342480-1799541496.png" /></p> <blockquote> <p>MySQL中的SQL语句是不区分大小写的,因此SELECT和select的作用是相同的,但是,许多开发人员习惯将关键字大写、数据列和表名小写,读者也应该养成一个良好的编程习惯,这样写出来的代码更容易阅读和维护。</p> </blockquote> <h3>3.2 列的别名</h3> <ul> <li>重命名一个列</li> <li>便于计算</li> <li>紧跟列名,也可以 <strong>在列名和别名之间加入关键字AS,别名使用双引号</strong>,以便在别名中包含空格或特殊的字符并区分大小写。</li> <li>AS 可以省略</li> <li>建议别名简短,见名知意</li> <li>举例</li> </ul> <pre><code class="language-mysql">SELECT last_name AS name, commission_pct comm FROM employees; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140346130-643167112.png" /></p> <pre><code class="language-mysql">SELECT last_name "Name", salary*12 "Annual Salary" FROM employees; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140348470-1873571375.png" /></p> <p><img alt="" src="images/1554951655368.png" /></p> <h3>3.3 去除重复行</h3> <p>默认情况下,查询返回所有行,包括重复行。<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>By default, the query returns all rows, including duplicate rows.</font></em></details></p> <pre><code class="language-sql">SELECT department_id FROM employees; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140351063-907171523.png" /></p> <p><img alt="" src="images/1554951715923.png" /></p> <p><strong>在SELECT语句中使用关键字DISTINCT去除重复行</strong></p> <pre><code class="language-sql">SELECT DISTINCT department_id FROM employees; </code></pre> <p><img alt="第03章 MySQL基本的SELECT语句" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/993310-20211123140353166-1769441431.png" /></p> <p><img alt="" src="images/1554951801044.png" /></p> <p>针对于:</p> <pre><code class="language-mysql">SELECT DISTINCT department_id,salary FROM employees; </code></pre> <p>这里有两点需要注意:</p> <ol> <li>DISTINCT 需要放到所有列名的前面,如果写成 <code>SELECT salary, DISTINCT department_id FROM employees</code>会报错。</li> <li>DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id),只需要写 <code>DISTINCT department_id</code>即可,后面不需要再加其他的列名了。</li> </ol> <h3>3.4 空值参与运算</h3> <ul> <li>所有运算符或列值遇到null值,运算的结果都为null</li> </ul> <pre><code class="language-sql">SELECT employee_id,salary,commission_pct, 12 * salary * (1 + commission_pct) "annual_sal" FROM employees; </code></pre> <p>这里你一定要注意,在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。</p> <h3>3.5 着重号</h3> <ul> <li>错误的</li> </ul> <pre><code class="language-mysql">mysql> SELECT * FROM ORDER; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER' at line 1 </code></pre> <ul> <li>正确的</li> </ul> <pre><code class="language-mysql">mysql> SELECT * FROM ; +----------+------------+ | order_id | order_name | +----------+------------+ | 1 | shkstart | | 2 | tomcat | | 3 | dubbo | +----------+------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM ; +----------+------------+ | order_id | order_name | +----------+------------+ | 1 | shkstart | | 2 | tomcat | | 3 | dubbo | +----------+------------+ 3 rows in set (0.00 sec) </code></pre> <ul> <li>结论</li> </ul> <p>我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对`(着重号)引起来。

    3.6 5、查询常数

    SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。

    您可能会问,为什么我们必须查询常量。

    [En]

    You might ask why we have to query the constant.

    SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。

    比如说,我们想对 employees 数据表中的员工姓名进行查询,同时增加一列字段 corporation,这个字段固定值为”尚硅谷”,可以这样写:

    SELECT '尚硅谷' as corporation, last_name FROM employees;
    

    4. 显示表结构

    使用DESCRIBE 或 DESC 命令,表示表结构。

    DESCRIBE employees;
    或
    DESC employees;
    
    mysql> desc employees;
    +----------------+-------------+------+-----+---------+-------+
    | Field          | Type        | Null | Key | Default | Extra |
    +----------------+-------------+------+-----+---------+-------+
    | employee_id    | int(6)      | NO   | PRI | 0       |       |
    | first_name     | varchar(20) | YES  |     | NULL    |       |
    | last_name      | varchar(25) | NO   |     | NULL    |       |
    | email          | varchar(25) | NO   | UNI | NULL    |       |
    | phone_number   | varchar(20) | YES  |     | NULL    |       |
    | hire_date      | date        | NO   |     | NULL    |       |
    | job_id         | varchar(10) | NO   | MUL | NULL    |       |
    | salary         | double(8,2) | YES  |     | NULL    |       |
    | commission_pct | double(2,2) | YES  |     | NULL    |       |
    | manager_id     | int(6)      | YES  | MUL | NULL    |       |
    | department_id  | int(4)      | YES  | MUL | NULL    |       |
    +----------------+-------------+------+-----+---------+-------+
    11 rows in set (0.00 sec)
    

    每个字段的含义如下:

    [En]

    The meanings of each field are explained as follows:

    • Field:表示字段名称。
    • Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
    • Null:表示该列是否可以存储NULL值。
    • Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
    • Default:表示该列是否有默认值,如果有,那么值是多少。
    • Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。

    5. 过滤数据

    • 背景:

    第03章 MySQL基本的SELECT语句
    • 语法:
    SELECT 字段1,字段2
    FROM 表名
    WHERE 过滤条件
    
    • 使用WHERE 子句,将不满足条件的行过滤掉
    • WHERE子句紧随 FROM子句
    • 举例
    SELECT employee_id, last_name, job_id, department_id
    FROM   employees
    WHERE  department_id = 90 ;
    

    第03章 MySQL基本的SELECT语句

    Original: https://www.cnblogs.com/wxdnq/p/15592959.html
    Author: 微笑带你去
    Title: 第03章 MySQL基本的SELECT语句

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508016/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql(mariadb)

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年8月23日
    0226
  • 使用Java刷评论为平台引流的经历

    场景:需要在一网站中批量评论留言。分析接口:列表接口获取idList,返回的是json数据直接用FastJson转就可以,如果返回的是HTML片段,则需要使用Jsoup进行提取,值…

    数据库 2023年6月14日
    090
  • MYSQL基础学习笔记

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年9月4日
    0156
  • Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香…

    做程序员就少不了与一些工具打交道,比如:监控工具、管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求。 对于redis管理工具来说,也有…

    数据库 2023年6月9日
    080
  • 阿里云智能客服机器人,自定义函数调用配置

    说明:也是没有段子的一天…..在没有段子的日子里….我们来研究下阿里云的客服机器人…. 一、功能调查 官网地址:https://help.ali…

    数据库 2023年6月6日
    098
  • 1_MySQL

    概念: 数据库是按照数据结构来组织, 存储和管理数据的仓库, 是一个长期存储在计算机内的, 有组织的, 有共享的, 统一管理的数据集合 分类: 网状结构数据库: 美国通用汽车公司I…

    数据库 2023年6月11日
    051
  • MySQL学习(2)—MySQL数据类型

    ps:此随笔基于mysql 5.7.*版本。 补充: UNSIGNED:所有整数类型都可以有一个可选(非标准)UNSIGNED属性。无符号类型可用于在列中仅允许非负数存在,或者当开…

    数据库 2023年6月14日
    065
  • mybatis-plus详细讲解

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年11月8日
    0264
  • Mysql客户端的安装

    Mysql数据库(简称)属于C/S架构,正常工作中一般都会提供服务端,我们只需要安装客户端进行查询修改数据等操作即可。 在正常工作中,无论是测试人员还是开发人员,总数据库管理员(测…

    数据库 2023年5月24日
    066
  • 了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年11月12日
    0177
  • MySQL索引分类及相关概念辨析

    本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇《MySQL索引底层数据结构及原理深入分析》很受读者欢迎,成功地…

    数据库 2023年6月11日
    072
  • Javaweb06-JDBC

    1、jdbc.properties配置文件 jdbc.properties driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql…

    数据库 2023年6月16日
    071
  • MyBatis-Plus入门教程及基本API使用案例

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年9月4日
    0153
  • mysql入门到精通完整学习教程,基础入门-数据库实战

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    数据库 2022年9月4日
    0141
  • 2022的七夕,奉上7个精美的表白代码,同时教大家快速改源码自用

    🤵‍♂️ 个人主页:奇想派👨‍💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️!🗺️学海无涯苦作舟,🛤️编程之路无悔路!📝 如果文章对你有帮…

    数据库 2023年6月16日
    093
  • MySQL索引

    一、索引介绍 索引(index)是帮助MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,…

    数据库 2023年5月24日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球