除了上篇中说到的简单表达式之外,SQL还支持一些聚合函数让我们从一组行信息从提取总结出信息。聚合函数可以被用来回答像“xxx导演执导了多少电影?”,”每一年最高分的电影是什么?”这类问题。
1 | SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … |
如果不特定指定分组,每一个聚合函数会对整个集合进行运算,返回单个值,就像一般的表达式一样,给你的聚合函数一个别称会让结果更容易阅读和处理。
常见的聚合函数
下面表格中列出了常见的聚合函数
函数 | 描述 |
---|---|
COUNT(*), COUNT(column) | 如果不指定列名就是返回总记录数,否则返回特定没有NULL值的行的数量 |
MIN(column) | 返回特定列中的最小值对于所有行 |
MAX(column) | 返回特定列中的最大值对于所有行 |
AVG(column) | 返回特定列中的平均值对于所有行 |
SUM(column) | 返回特定列中的数量的总和对于所有行 |
分组聚合函数
除了对所有行进行聚合,我们还可以按照单独的一组数据来进行聚合。
这样的结果是将会产生很多个结果,因为有很多个不同的组通过 GROUP BY 子句来进行定义。
1 | SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … |
GROUP BY 子句通过组合在指定列中有相同值的行来工作。
限制分组后的结果
你可能已经注意到了 GROUP BY 子句会在 WHERE 子句执行之后执行,所以我们应该如何过滤分好组的行呢?
SQL允许我们通过增加额外的 HAVING 子句来与 GROUP BY 一起使用来过滤已经被分好组的数据集。
1 | SELECT group_by_column, AGG_FUNC(column_expression) AS aggregate_result_alias, … |
HAVING 子句的写法和 WHERE 子句一样,但是被应用在分好组的行上。
注意:如果不使用 GROUP BY 那么就使用 WHERE 就够了。