SQL中where与having的区别

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;#使用过滤语句。最好!

原文地址:https://www.cnblogs.com/qqq789001/p/13933720.html