Skip to content

第六章 查询数据 v1.0 ​

一、基本查询语句 ​

1.数据库基本查询语句 ​

sql
SELECT [ALL|DISTINCT] *|<列名列表>[ AS <别名>]
FROM <表名列表>|(SELECT子查询) [AS <别名>]
[WHERE 子句]
[GROUP BY <列名> [HAVING 短语]]
[ORDER BY <列名> [ASC|DESC]]
[LIMIT <记录数>[ OFFSET <初始位置>]];

2.简单查询 ​

sql
SELECT [ALL|DISTINCT] *|<列名列表>[ AS <别名>]
FROM <表名列表> [AS <别名>];

ALL 为默认值,DISTINCT 表示删除重复项;* 表示查询表中所有列,也可以指定列名查询指定列。

3.限制查询结果条数 ​

sql
LIMIT <初始位置>,<记录数>           # 写法1
LIMIT <记录数> [OFFSET <初始位置>]  # 写法2

初始位置的索引从 0 开始,例如 4 表示从第 5 条记录开始查询。

二、WHERE子句 ​

sql
WHERE <条件表达式>

字符匹配通配符:% 匹配任意个任意字符,_ 匹配一个任意字符,REGEXP 表示使用正则表达式匹配。

三、ORDER BY子句 ​

sql
ORDER BY <列名> [ASC|DESC]

按照一个或多个属性列的升序(ASC)或降序(DESC)排列查询结果,默认为升序。

四、聚集函数 ​

聚集函数只能用于 SELECT 子句和 GROUP BY 中的 HAVING 子句。若使用分组,分组后聚集函数会作用于每一组。DISTINCT 代表计算时取消指定列中的重复值。

五、GROUP BY子句 ​

sql
GROUP BY <列名> [WITH ROLLUP] [HAVING <条件表达式>]

GROUP BY 会将查询结果按一列或多列的值分类,值相等的记录为一组。HAVING 用于筛选分组结果,可以使用聚集函数。

sql
# 查询选修了三门以上课程的学生学号
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(*) > 3;

GROUP_CONCAT() 可以把每个分组的字段值显示出来:

sql
SELECT sex, GROUP_CONCAT(name)
FROM stu
GROUP BY sex;

WITH ROLLUP 可以在结果最后增加一条汇总记录:

sql
SELECT sex, GROUP_CONCAT(name)
FROM stu
GROUP BY sex WITH ROLLUP;

六、复杂查询 ​

1.连接查询 ​

交叉连接:

sql
SELECT <字段名>
FROM <表1> [CROSS JOIN] <表2> [WHERE子句];

使用 WHERE 子句时,MySQL 会先生成两个表的笛卡尔积,再选择满足条件的记录。

内连接合并具有同一列的两个或多个表的行,结果集中不包含不匹配的行:

sql
SELECT <字段名>
FROM <表1> INNER JOIN <表2> [ON子句];

外连接除了返回满足连接条件的行,还会返回左表或右表中不满足条件的行,没有匹配的列使用 NULL 表示。MySQL 不支持 SQL99 语法的全外连接,只支持左外连接和右外连接:

sql
SELECT <字段名>
FROM <表1> LEFT|RIGHT OUTER JOIN <表2> <ON子句>;
几种连接的关系 ​

几种连接的关系

2.嵌套查询 ​

子查询指将一个查询语句嵌套在另一个查询语句中,可以在 SELECT、UPDATE 和 DELETE 语句中使用,也可以进行多层嵌套。

1.基本形式 ​
sql
WHERE <表达式> <操作符> (SELECT子查询)
2.操作符 ​

3.集合查询 ​

1.基本形式 ​
sql
<查询块>
    UNION|INTERSECT|EXCEPT
<查询块>
2.集合查询的类别 ​
3.几种集合查询的关系 ​

几种集合查询的关系

4.基于派生表的查询 ​

sql
SELECT *|<列名列表>
FROM (SELECT子查询 [AS <别名>(<列名列表>)]);

派生表可以将 SELECT 子查询的结果作为表供外层 SELECT 查询使用。