目前为止,我们看到的聚合函数的使用方法,无论是否包含NULL,无论是否删除了重复数据,都是针对表中的所有数据进行的聚合处理。下面,我们先把表分成几组,然后再进行聚合处理。
按照商品种类来统计一下数据行数(=商品数量)
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui;
正常情况下,使用聚合函数,不管原数据有多少,最终的结果都是返回一行!但上图返回的结果集显示,不是这样的,这是为啥?
这是因为,使用GROUP BY子句时,会将表中的数据分为多个组进行处理
分组之后再对每一个分组进行的聚合计算!所以,有三个分组,返回回来的也就有3行数据。
在GROUP BY子中指定的列称为聚合键或者分组列。由于能够决定表的切分方式,所以是非常重要的列。当然,GROUP BY子也和SELECT子句一样可以通过逗号分隔指定多列。
注意:聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。
此外,GROUP BY子句的书写位置也有严格要求,一定要写在FROM语句之后(如果有WHERE子的话,需要写在WHERE子句之后)。如果无视子句的书写顺序,SQL会报错。
到目前为止的子句书写顺序:
现在我们已经知道了子句的书写顺序,为了让大家在写代码的时候更有逻辑性,我们现在着手理解一下,这几个语句之间的执行顺序!
没错,首先,语句先找到FROM之后的表格,然后从表格中找到符合WHERE条件的数据,之后对数据进行分组,再瞅瞅SELECT函数中是否有聚合函数之类的,对数据做聚合运算。
与聚合函数和GROUPBY子有关的常见错误
1、聚合键之外的列名书写在SELECT子句之中
这里经常会出现的错误就是把聚合键之外的列名书写在SELECT子句之中。
SELECT shohin_mei, shiire_tanka, COUNT(*)
FROM Shohin
GROUP BY shiire_tanka;
报错原因:列名shohin mei并没有包含在GROUP BY子当中。具体的原理,可以考虑上面说的子句的执行顺序!
使用GROUPBY子句时,SELECT子中不能出现聚合键之外的列名。
2、GROUP BY子句中不能使用SELECT子句中定义的别名
报错原因:考虑SQL语句在DBMS内部的执行顺序。
在GROUP BY子句中不能使用SELECT子句中定义的别名。
3、GROUP BY子句结果的显示是无序的
通常SELECT语句执行结果的显示顺序都是随机的。因此想要按照某种特定顺序进行排序的话,需要在SELECT语中进行指定。具体的方法将在第4节中学习
GROUP BY子句结果的显示是无序的
4、在WHERE子句中使用聚合函数
实际上,只有 SELECT 子句和 HAVING 子句(以及之后将要学到的ORDER BY子句)中能够使用 COUNT 等聚合函数。并且,HAVING 子句可以非常方便的实现上述要求。下一节我们将会学习 HAVING 子句
只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。