where 在分组之前进行限定,如果不满足条件,则不参与分组。
having在分组之后进行限定,如果不满足结果,则不会被查询出来
where 后不可以跟聚合函数,having可以进行聚合函数的判断。
例如:
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
sql可以分为三部分:
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70
第一步:限定条件是math > 70
,也就是说首先是查询数学成绩在70分以上的,70分以下的查询不出来。
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex
第二步:对第一步的查询结果进行分组查询,按照性别分为两组。
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
第三步:对第二部的查询结果进行再次筛选,只保留数量大于2的。
优化一下SQL,可以为count(id)
起一个别名。
SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;