目录
1. 数据库查询
查询语法如下:
SELECT [ALL|DISTINCT|DISTINCTROW] 输出项, ...
[FROM 表名|视图名] /*指定数据源*/
[WHERE 条件表达式] /*指定查询条件*/
[GROUP BY ... ] /*指定分组项*/
[HAVING 条件] /*指定分组后筛选条件*/
[ORDER BY ...] /*指定输出行排列依据项*/
[LIMIT 行数] /*指定输出行范围*/
[UNION SELECT语句] /*数据源联合*/
[WINDOWS ...] /*窗口定义*/
1.1 输出项为列名
之后的例子都会用 library 这个数据库来进行演示,数据库的创建见 图书管理系统实战源代码 。
USE library;
SELECT id, `name`, press FROM book;

注:由于 name 是关键字,为了查询时避免出错,可将关键字用 `` 括起来。
1.2 输出项为表达式
USE library;
SELECT id AS 学号, `name` AS 姓名, FORMAT(grade-1,0) AS 用户星级(扣一分) FROM borrower
WHERE borrowedCount > 0;

可以用 AS 定义一个别名作为新的计算结果列的名称。
1.3 输出内容变换
在对表进行查询时,输出列显示内容可以通过 CASE 语句进行变换。
USE library;
SELECT id AS 学号,
CASE
WHEN LEFT(id,1) = '1' THEN '教师'
ELSE '学生'
END AS 类别
FROM borrower;

1.4 消除输出项的重复行
查询结果显示“输出项”可能会出现重复行,可以使用 DISTINCT 或 DISTINCTROW 关键字消除结果集中的重复行。
USE library;
SELECT grade AS 星级 FROM borrower;
SELECT DISTINCT grade AS 星级 FROM borrower;

1.5 聚合函数
输出项为表达式中用到的系统函数仅仅是对包含的列值进行处理,而这里的“聚合函数”处理的是查询得到的行和列。
| 函数名 | 说明 |
|---|---|
| COUNT | 求记录行数 |
| MAX | 求最大值 |
| MIN | 求最小值 |
| SUM | 求表达式的和 |
| AVG | 求表达式的平均值 |
| STD或STDDEV | 求表达式列中所有值的标准差 |
| VARIANCE | 求表达式列中所有值的方差 |
| GROUP_CONCAT | 产生由属于一组的列值连接组合而成的字符串 |
2. 查询条件:逻辑条件
WHERE 子句指定查询条件。
表达式 <比较运算符> 表达式 /*比较运算*/
| 匹配列 [NOT] LIKE 表达式 [ESCAPE '转义字符'] /*模式匹配*/
| 匹配列 [NOT] [REGEXP | RLIKE] 正则表达式 /*模式匹配*/
| 表达式 [NOT] BETWEEN 表达式 AND 表达式 /*范围限定*/
| 表达式 [NOT] IN (值, ...) /*范围限定*/
| 表达式 IS [NOT] NULL /*空值判断*/
| 表达式 [NOT] IN (SELECT语句) /*IN子查询*/
| 表达式 比较运算符 ALL | SOME | ANY (SELECT语句) /*比较子查询*/
| [NOT] EXISTS (SELECT语句) /*EXISTS子查询*/
| 逻辑值
2.1 比较运算
USE library;
SELECT * FROM book
WHERE publishDate >= 2017 AND publishDate < 2019;

2.2 模式匹配
模式匹配包括两种形式:使用 LIKE 进行简单模式匹配和用 REGEXP 实现正则表达式匹配。
-
LIKE简单模式匹配
LIKE运算符用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char、varchar、text、datetime等类型的数据,返回逻辑值TRUE或FALSE。匹配列 [NOT] LIKE 表达式 [ESCAPE '转义字符']在使用LIKE将匹配列与表达式进行模式匹配时,常使用特殊符号_和%,它们可用来进行模糊查询。其中,“%”代表0个以上字符,“_”则代表单个字符。
USE library; SELECT * FROM book WHERE id LIKE '10110___5%'; # 3个'_'连字符
-
REGEXP正则表达式匹配
REGEXP运算符通过正则表达式来执行更复杂的字符串匹配运算,它是MySQL对SQL标准的一种扩展,功能极为强大,另外,REGEXP还有一个同义词是RLIKE。匹配列 [NOT] [REGEXP | RLIKE] 正则表达式不同于
LIKE运算符仅有“_”和“%”两个匹配符,REGEXP拥有更多具有特殊含义的符号,参见下表。特殊字符 含义 ^ 匹配字符串的开始部分 $ 匹配字符串的结束部分 . 匹配任何一个字符(包括回车和新行) * 匹配星号之前的0个或多个字符的任何序列 + 匹配加号之前的1个或多个字符的任何序列 ? 匹配问号之前0个或多个字符 {n} 匹配括号前的内容出现n次的序列 () 匹配括号里的内容 [abc] 匹配方括号里出现的字符串abc [a-z] 匹配方括号里出现的a~z之间的1个字符 [^a-z] 匹配方括号里出现的不在a~z之间的1个字符 | 匹配符号左边或右边出现的字符串 [[…]] 匹配方括号里出现的符号(如空格、换行、括号、句号、冒号、加号、连字符等) [[:<:] 和 [[:>:]] 匹配一个单词的开始和结束 [[: :] 匹配方括号里出现的字符中的任意一个字符
2.3 范围限定
-
BETWEEN…AND限定范围表达式 [NOT] BETWEEN 表达式1 AND 表达式2当不使用
NOT时,若表达式的值在表达式1值与表达式2值(表达式1≤表达式2)之间,返回TRUE,否则返回FALSE;使用NOT时,返回结果刚好相反。USE library; SELECT * FROM book WHERE publishDate BETWEEN 2017 AND 2018;
-
IN…限定范围
使用IN运算符可以指定一个值表,其中列出所有可能的值。表达式 [NOT] IN (值, ...)当不使用
NOT时,若表达式的值与值表中的任一个匹配,即返回TRUE,否则返回FALSE;使用NOT时,表达式的值与值表中的没有一个匹配,即返回TRUE,否则返回FALSE。USE library; SELECT * FROM book WHERE publishDate IN (2017, 2018);
2.4 空值判断
使用 IS NULL 运算符判定一个表达式的值是否为空。
表达式 IS [NOT] NULL
当不使用 NOT 时,若表达式的值为空,返回 TRUE,否则返回 FALSE;使用 NOT 时,结果刚好相反。
3. 分组
GROUP BY 子句主要用于对查询结果按行分组:
GROUP BY 列名 | 表达式, ... [WITH ROLLUP]
说明:
- 列名或表达式就是分组依据,可以是一个或多个,列名或表达式相同的为同一组,作为统计汇总的依据。
WITH ROLLUP指定在结果集内组后还包含汇总行。- 在系统默认状态下,
SQL_MODE设置包含sql_mode = only_full_group_by,包含“GROUP BY x”的SELECT输出项,除了x项,其他只能是采用聚合函数的项。否则需要在SQL_MODE设置中不能包含sql_mode = only_full_group_by。
3.1 基本分组
SELECT category AS 类别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrower
GROUP BY category;

3.2 分组汇总
GROUP BY 后的列或者表达式包含一个以上,此时的分组就出现了多个层次。
SELECT category AS 类别, sex AS 性别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrower
GROUP BY category, sex;

4. 分组后筛选
HAVING 子句的目的与 WHERE 子句一样均为定义筛选条件,不同的是 WHERE 子句是用来在 FROM 子句之后选择行,而 HAVING 子句则是用来在 GROUP BY 子句后选择行。不过 HAVING 子句中的条件可以包含聚合函数,而 WHERE 子句则不可以。
语法格式为:
SELECT
...
GROUP BY ...
HAVING 条件
示例如下:
SELECT category AS 类别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrower
GROUP BY category;
SELECT category AS 类别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrower
GROUP BY category
HAVING SUM(borrowedCount) > 5;

5. 输出行排序
5.1 ORDER BY
ORDER BY 子句指定查询结果中的记录行按指定内容顺序排列。
ORDER BY 列名 | 表达式 | 位置序号 [ASC | DESC], ...
说明: ORDER BY 子句后可以是一个或者一个以上的列、表达式或位置序号,位置序号为一正整数,表示按结果表中该位置上的列排序。
SELECT id AS 学号, `name` AS 姓名, borrowedAll AS 已借书籍数
FROM borrower
WHERE LEFT(id,1)='2'
ORDER BY 3 DESC;

说明:
- 使用
ORDER BY 3表示对SELECT列清单上的第3列(即“已借书籍数”列)进行排序。 - 关键字
DESC表示降序排列,ASC则表示升序排列,不选该项,系统默认为ASC。
ORDER BY子句可以与GROUP BY配合使用,且可用在多个表上,对符合要求的记录先分组再排序。
SELECT category AS 类别, SUM(borrowedAll) AS SUM(已借书籍数)
FROM borrower
GROUP BY category
ORDER BY SUM(已借书籍数) ASC;

5.2 LIMIT
LIMIT 子句主要用于限制被 SELECT 语句返回的行数。
LIMIT [起始行,] 行数 | 行数 OFFSET起始行
“起始行”和“行数”都必须是非负的整数,返回指定“起始行”开始的“行数”条记录。起始行的偏移量为 0,而不是 1。
SELECT id AS 学工号, `name` AS 姓名, borrowedAll AS 已借书籍数 FROM borrower
ORDER BY 已借书籍数 DESC LIMIT 2,4;

由于查询的知识点较多,所以将会分为几部分来进行分享。
参考书籍
《MySQL实用教程(第4版)》
上一篇文章:【数据库——MySQL】(5)运算符、表达式和系统函数
下一篇文章:【数据库——MySQL】(7)查询(2)










