聚合函数是比较where、having的关键
where、聚合函数、having在from后面的执行顺序:
where > 聚合函数(sum、min、max、avg、count)> having
简单来说,where先执行,再执行聚合函数,再执行having
①where 是一个约束声明,即在返回结果之前起作用,而且在where条件后面不能使用聚合函数。因为where的优先级大于聚合函数。
错误语句:select sum(t.score) from student t group by t.sex where sum(t.age)>100;(在where之后使用了聚合函数)
②having是一个过滤声明,即在返回结果之后对查询结果进行过滤,在having条件后面可以使用聚合函数。因为聚合函数的优先级大于having。其次,having是对查出来的结果进行过滤,所以没有查出来的结果不能进行过滤。
错误语句:select t.id,t.name from student t having t.score >90;(只查询了id,name,但是having过滤score)
一、where、having都可以使用的情况
正确语句:select t.id, t.name , t.age from student t where t.age > 22
正确语句:select t.id ,t.name , t.age from student t having t.age > 22
都是查询年龄大于22岁的人的资料,因为查询了id 、name 、age,所以用having可以删选age
二、只可以用where,不可以用having 的情况
正确语句:select t.id, t.name from student t where t.age > 22
错误语句:select t.id ,t.name from student t having t.age > 22 (错误的)
where查询了年龄大于22岁的人的资料,语句2中,只查询了id,name,没有查询age,所以having中不能用age来筛选!
三、只可以用having,不能用where的情况
having是分组(group by)后的筛选条件,分组后的数据组内再筛选;where则是在分组前筛选。
正确语句:select t.id , t.name , avg(t.age) as ag from student t group by id , name having ag >22
错误语句:select t.id , t.name , avg(t.age) as ag from student t where ag > 22 group by id, name
因为where的优先级大于聚合函数,所以实质上是没有执行 avg(t.age) as ag ,所以where条件不成立,执行错误。