目录
GROUP BY
GROUP BY语句用于对指定的字段进行分类,之后用来与聚合函数(aggregate functions)例如统计(COUNT), 求和(SUM), 求平均(AVG), 求最小最大值(MIN/MAX)联合使用来得到一个或多个列的结果集。
基本的语法为:
SELECT
column1, column2, ... column_n, aggregate_function (expression)
FROM
tables
WHERE
condition1 [and/or condition2...]
GROUP BY
column1, column2, ... column_n; # 可以对多个分组条件进行分组
一个小栗子
例如需要查询每个班级中的最高分数,学生分数表(scores)的主要字段有三个class_id, student_id, student_score
,查询语句如下:
select
class_id, MAX(student_score)
from
scores
group by
class_id
Tips
因为聚合函数通过作用于某一个分组集合而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值(例如上述的student_score就是作为MAX函数的输入),要么为GROUP BY语句的参数(例如上述的class_id就是作为group by的输入),否则会出错。如果将上述查询语句换成:
select
class_id, MAX(student_score), student_id
from
scores
group by
class_id
那么就会出现Column ‘scores.student_id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
。出现以上错误的原因是因为一个班级id对应多个学生,如果我们简单的在SELECT语句中写上student_id,则无法判断应该输出分组当中的哪一个学生id。
HAVING
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING后面接的参数也只能是对分组的参数条件筛选或者是使用聚合函数进行筛选。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。示例:
select
class_id, MAX(student_score)
from
scores
group by
class_id
having
class_id>=3 and avg(student_score)>=80; # having筛选班级编号以及班级成绩均分,去除不想要要的分组集合