SQL中where与having的区别
where:
where是一个约束声明,使用where来约束来自数据库的数据。
where是在结果返回之前起作用的。
where中不能使用聚合函数。
执行顺序:where 早于 group by, 早于 having,where子句在聚合前先筛选记录
having:
having是一个过滤声明;
在查询返回结果集以后,对查询结果进行的过滤操作。
在having中可以使用聚合函数。
having子句在聚合后对组记录进行筛选。
例题:
10、查询平均成绩大于60分的同学的学号和平均成绩;
select student_id,avg(num) avg from score group by student_id where avg>60; # 错误!,因为where子句在聚合前先筛选记录,执行where语句时,还没有执行avg(num) 函数,也就没有avg值。
select t.student_id, t.avg from (select student_id,avg(num) avg from score group by student_id) as t where t.avg>60; #使用子查询也可以实现。
select student_id,avg(num) avg from score group by student_id having avg>60;#使用过滤语句。最好!