3-1 对表进行聚合查询
-
聚合函数
通过SQL对数据进行某种操作或计算时需要使用函数,以下是5个常用的函数
- COUNT:计算表中的记录数(行数)
- SUM:计算表中数值列中数据的合计值
- AVG:计算表中数值列中数据的平均值
- MAX:求出表中任意列中数据的最大值
- MIN:求出表中任意列中数据的最小值
如上所示,用于汇总的函数称为聚合函数或者聚集函数,所谓聚合,就是将多行汇总成一行,实际上,所有的聚合函数都是这样,输入多行输出一行
-
计算表中数据的行数
使用COUNT函数时,输入表的列,就能够输出数据行数
注意:COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(列名)会得到NULL之外的数据行数
-
计算合计值——SUM函数
四则运算中如果存在NULL,结果一定是NULL,但是对于SUM函数来说,即使包含NULL,也可以计算出合计值
-
计算平均值——AVG函数
-
计算最大值和最小值——MAX函数和MIN函数
MAX/MIN函数与SUM/AVG函数有一点不同,那就是SUM/AVG函数只能对数值类型的列使用,而MAX/MIN函数原则上可以适用于任何数据类型的列
-
使用聚合函数删除重复值(关键字DISTINCT)
想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT
3-2 对表进行分组
- 重点
-
GROUP BY子句
在GROUP BY子句中指定的列称为聚合键或者分组列,GROUP BY 子句和SELECT子句一样,可以通过逗号分隔指定多列;
GROUP BY子句的书写顺序: SELECT—FROM—WHERE—GROUP BY
-
聚合键中包含NULL的情况:
聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来
-
使用WHERE子句时GROUP BY的执行结果
-
与聚合函数和GROUP BY子句有关的常见错误
-
在使用COUNT这样的聚合函数时,SELECT子句中的元素有严格的限制。实际上,使用聚合函数时,SELECT子句中只能存在以下三种元素:
- 常数
- 聚合函数
- GROUP BY 子句中指定的列名(即聚合键)
注意:只有MySQL认同这种语法,所以能够执行,不会发生错误(在多列候补中只要有一列满足要求就可以了)但是MySQL以外的DBMS都不支持这样的语法
-
在GROUP BY子句中不能写列的别名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ojf1rZFu-1604978007378)(C:\Users\AUSU888888\AppData\Roaming\Typora\typora-user-images\image-20200802112001004.png)]
-
3-3 为聚合结果指定条件
- 重点
-
HAVING子句
WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件,对集合指定条件需要用HAVING子句
-
HAVING子句的构成要素
HAVING子句和包含GROUP BY子句时的SELECT子句一样,能够使用的要素有一定的限制,限制内容也是完全相同的。HAVING子句中能够使用的3种要素如下:
- 常数
- 聚合函数
- GROUP BY子句中指定的列名(即聚合键)
- 相对于HAVING子句,更适合写在WHERE子句中的条件
即聚合键所对应的条件不应该书写在HAVING子句中,而应该书写在WHERE子句当中
WHERE子句和HAVING子句的执行速度
3-4 对查询结果进行排序
- 重点
-
ORDER BY 子句
通常,从表中抽取数据时,如果没有特别指定顺序,最终排列顺序便无从得知。即使是同一条SELECT语句,每次执行时排列顺序很可能发生改变,这时,便需要通过在SELECT语句末尾添加ORDER BY子句来明确指定排列顺序;
不论何种情况,ORDER BY子句都需要写在SELECT语句的末尾。这是因为对数据行进行排序的操作必须在结果即将返回时执行。ORDER BY子句中书写的列名称为排序键;
-
指定升序或降序
未指定ORDER BY子句中排列顺序时会默认使用升序进行排列,若要降序排列,可以在列名后面使用DESC关键字
-
排序键中包含NULL时,会在开头或末尾进行汇总
-
在排序键中可以使用显示用的别名
- ORDER BY子句中可以使用SELECT子句中未使用的列和聚合函数