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;