mysql中where和having的区别

having子句与where都是设定条件筛选的语句。

区别:

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合函数

在查询过程中执行顺序:from>where>group(包含聚合)>having>order>select

所以聚合函数(sum,min,max,avg,count)要比having子句优先执行,而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)

1
2
where子句:
select sum(num) as rmb from order where id>10//只有先查询出 id大于10的记录才能进行聚合语句
1
2
3
4
5
having子句:
select age, count(*) from employees group by age having count(*) > 4
//上例having条件表达式为聚合语句,肯定的说having子句查询过程执行优先级别低于聚合语句。
//再换句话说把上面的having换成where则会出错,统计分组数据时用到聚合语句。
//对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。

having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。having子句可以让我们直接筛选成组后的各组数据,也可以在聚合后对组记录进行筛选,而where子句在聚合前先筛选记录,也就是说作用在GROUP BY 子句和having子句前。