第六章 查询数据 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 查询使用。