一、对表进行聚合查询
1 聚合函数
用于汇总的函数称为聚合函数:
- COUNT:计算表中的记录数(行数)
- SUM: 计算表中数值列中数据的合计值
- AVG: 计算表中数值列中数据的平均值
- MAX: 求出表中任意列中数据的最大值
- MIN: 求出表中任意列中数据的最小值
(1)计算全部数据的行数:COUNT
SELECT COUNT(*)
FROM <表名>;
--输入值为全部列(*)或parameter
【注意】COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据 行数,而COUNT()会得到NULL之外的数据行数。
(2)计算合计值:SUM
SELECT SUM(<列名>)
FROM <表名>;
(3)计算平均值:AVG
SELECT AVG(<列名>)
FROM <表名>;
(4)计算最大值和最小值:MAX、MIN
SELECT MAX(<列名>), MIN(<列名>)
FROM <表名>;
【注意】MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列。
2 使用聚合函数删除重复值(关键字DISTINCT)
在聚合函数的参数中使用DISTINCT,可以删除重复数据。
- 想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT。
SELECT COUNT (DISTINCT <列名>)
FROM <表名>;
二、对表进行分组
1 GROUP BY子句
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;
【注意】使用GROUP BY子句有以下四个注意点:
- 只能写在SELECT子句之中
- GROUP BY子句中不能使用SELECT子句中列的别名
- GROUP BY子句的聚合结果是无序的
- WHERE子句中不能使用聚合函数
2 聚合键中包含NULL的情况
聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。
3 使用WHERE子句时GROUP BY的执行结果
(1)使用WHERE子句和GROUP BY子句进行汇总处理:
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
WHERE
GROUP BY <列名1>, <列名2>, <列名3>, ……;
(2)GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序:
- FROM → WHERE → GROUP BY → SELECT
4 与聚合函数和GROUP BY子句有关的常见错误
- 错误1:把聚合键之外的列名书写在 SELECT 子句之中。
- 错误2:在GROUP BY子句中写了列的别名。
- 错误3:误以为GROUP BY子句的结果能排序。
- 错误4:在WHERE子句中使用聚合函数。
【注意】只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。
三、为聚合结果指定条件
1 HAVING子句
WHERE 子句只能指定记录(行)的条件,而不能用来指定组的条件。对集合指定条件就需要使用其他的子句了,此时便可以用 HAVING 子句:
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>;
使用 HAVING 子句时 SELECT 语句的顺序:
- SELECT → FROM → WHERE → GROUP BY → HAVING
【注意】HAVING子句要写在GROUP BY子句之后。
2 HAVING子句的构成要素
HAVING 子句中 能够使用的 3 种要素如下所示:
- 常数
- 聚合函数
- GROUP BY子句中指定的列名(即聚合键)
3 相对于HAVING子句, 更适合写在WHERE子句中的条件
聚合键所对应的条件不应该书写在HAVING子句当中,而应该书写在WHERE子句当中。
四、对查询结果进行排序
1 ORDER BY子句
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ……
子句的书写顺序:
- SELECT 子句 → FROM 子句 →WHERE 子句 → GROUP BY 子句 → HAVING 子句 → ORDER BY 子句
2 指定升序或降序
未指定ORDER BY子句中排列顺序时会默认使用升序进行排列。想要降序排列时,可以在列名后面使用 DESC 关键字。
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列> DESC;
由于 ASC 和 DESC 这两个关键字是以列为单位指定的,因此可以 同时指定一个列为升序,指定其他列为降序。
3 指定多个排序键
如果想要对该顺序的商品进行更细致的排序的话,就需要再添加一个排序键,在 ORDER BY 子句中同时指定多个排序键。
4 NULL的顺序
使用含有 NULL 的列作为排序键时, NULL 会在结果的开头或末尾汇总显示。
5 在ORDER BY子句中可以使用SELECT子句中定义的别名
SELECT 子句的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。
【附】使用 HAVING 子句时 SELECT 语句的顺序:
- FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY