having 你可以认为是聚合函数的 where 部分,
使用聚合函数后,比如 avg(age) ,这是是不允许用where限定 avg(age)的,
而是用having avg(age)>21。
有聚合函数后,关于聚合函数的条件就用having。
最后一段的sql的目的是 选出年龄大于平均年龄的 学生的信息 ,但是是错误语句,少了group by。
很简单的问题,你可以这样理解 having 和 where 都是进行条件筛选的,但 having 必须和 group by 同时出现才可以,使用下面的例子吧
select classname 班级名, count(1) 人数
from student
where age > 12
group by classname
having count(*) > 20
这条SQL的功能是查询 所有学生所在班级年级大于12岁的学生超过20人的班级
这里面用到了分组,首先需要把年级大于12岁的学生找出来,是在分组(group by)之前进行的
然后进行分组,分组以后再判断 count(*) > 20,即 班级人数大于20人的,是在分组(group by)之后进行的
记住这两条就行,where 是在分组(group by)之前处理的,having 是在分组之后处理的
having大多时候要和group by一起使用;
student.age 最好用别名t.age(给student起个别名);
最后一条sql语句是说:查询出年龄大于平均年龄的学生。