目录
- 1. 数据库查询
- 1.1 输出项为列名
- 1.2 输出项为表达式
- 1.3 输出内容变换
- 1.4 消除输出项的重复行
- 1.5 聚合函数
- 2. 查询条件:逻辑条件
- 2.1 比较运算
- 2.2 模式匹配
- 2.3 范围限定
- 2.4 空值判断
- 3. 分组
- 3.1 基本分组
- 3.2 分组汇总
- 4. 分组后筛选
- 5. 输出行排序
- 5.1 ORDER BY
- 5.2 LIMIT
- 参考书籍
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 borrowerWHERE borrowedCount > 0;
可以用 AS
定义一个别名作为新的计算结果列的名称。
1.3 输出内容变换
在对表进行查询时,输出列显示内容可以通过 CASE
语句进行变换。
USE library;SELECT id AS 学号,CASEWHEN 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 bookWHERE 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 bookWHERE 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 bookWHERE publishDate BETWEEN 2017 AND 2018;
-
IN…
限定范围
使用IN
运算符可以指定一个值表,其中列出所有可能的值。表达式 [NOT] IN (值, ...)
当不使用
NOT
时,若表达式的值与值表中的任一个匹配,即返回TRUE
,否则返回FALSE
;使用NOT
时,表达式的值与值表中的没有一个匹配,即返回TRUE
,否则返回FALSE
。USE library;SELECT * FROM bookWHERE 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 borrowerGROUP BY category;
3.2 分组汇总
GROUP BY
后的列或者表达式包含一个以上,此时的分组就出现了多个层次。
SELECT category AS 类别, sex AS 性别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrowerGROUP 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 borrowerGROUP BY category;
SELECT category AS 类别, SUM(borrowedCount) AS SUM(当前借书数) FROM borrowerGROUP BY categoryHAVING SUM(borrowedCount) > 5;
5. 输出行排序
5.1 ORDER BY
ORDER BY
子句指定查询结果中的记录行按指定内容顺序排列。
ORDER BY 列名 | 表达式 | 位置序号 [ASC | DESC], ...
说明: ORDER BY
子句后可以是一个或者一个以上的列、表达式或位置序号,位置序号为一正整数,表示按结果表中该位置上的列排序。
SELECT id AS 学号, `name` AS 姓名, borrowedAll AS 已借书籍数FROM borrowerWHERE 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 borrowerGROUP BY categoryORDER BY SUM(已借书籍数) ASC;
5.2 LIMIT
LIMIT
子句主要用于限制被 SELECT
语句返回的行数。
LIMIT [起始行,] 行数 | 行数 OFFSET起始行
“起始行”和“行数”都必须是非负的整数,返回指定“起始行”开始的“行数”条记录。起始行的偏移量为 0
,而不是 1
。
SELECT id AS 学工号, `name` AS 姓名, borrowedAll AS 已借书籍数 FROM borrowerORDER BY 已借书籍数 DESC LIMIT 2,4;
由于查询的知识点较多,所以将会分为几部分来进行分享。
参考书籍
《MySQL实用教程(第4版)》
上一篇文章:【数据库——MySQL】(5)运算符、表达式和系统函数
下一篇文章:【数据库——MySQL】(7)查询(2)