“WHERE”用来约束数据来自数据库的数据,是一个约束声明,不能使用聚合函数。
“HAVING”用来过滤分组后的数据,通常与”GROUP BY“联合使用,是一个过滤声明,弥补了“WHERE”不能使用聚合函数。
二者最大的区别就是“HAVING”是对分组后的数据进行过滤,“WHERE”是对原始数据进行过滤。所以“WHERE”在SQL的执行顺序中仅低于“FROM”,而“HAVING”是在“GROUP BY”之后。
下面来个小例子:
这次在“实验楼”网站进行简单的练习,网站会提供一个虚拟桌面,用于练习。该环境已经装好了mysql,使用非常方便,但普通用户不能保存环境,进行大的练习的话,建议还是自己配一套环境,哈哈哈哈。
首先,创建了这样一张表:
我们先查看一个三个老师的学生的平均年龄:
SELECT teacher,AVG(age) FROM stuinfo GROUP BY teacher;
结果如下:
那如果我们想要一次性找到哪些老师带的学生的平均年龄且平均年龄大于7岁的,就有了两种方法
第一种,不用HAVING:
SELECT * FROM
(SELECT teacher,AVG(age) AS avgage FROM stuinfo GROUP BY teacher) t
WHERE t.avgage>7;
结果如下:
第二种,用HAVING:
SELECT teacher,AVG(age) AS avgage FROM stuinfo GROUP BY teacher HAVING AVG(age)>7;
可见,两种方式结果是一样的,但用HAVING逻辑会更加简单,语句也更简洁。
HAVING能够给分组用聚合函数设置条件。