欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL分组中WHERE和HAVING的异同

程序员文章站 2022-05-10 14:18:42
...
当我们使用SQL进行分组时,可以使用GROUP BY来实现:
select product_id,sum(amt)
from a_fin_factline
group by 1

程序意图很明显:按产品汇总销售额。

当我们需要对分组进行限制时,如剔除掉产品为null的组,可以通过两种方式来实现:
select product_id,sum(amt)
from a_fin_factline
group by 1
having product_id is not null;


select product_id,sum(amt)
from a_fin_factline
where product_id is not null
group by 1;


mysql中的执行时间对比:
select product_id,sum(amt)
from a_fin_factline
group by 1
having product_id is not null;
受影响的行: 0
时间: 1.086s

select product_id,sum(amt)
from a_fin_factline
where product_id is not null
group by 1;
受影响的行: 0
时间: 0.098s


可以看到使用WHERE时效率更高。

两种方式差异总结如下:
  • 语法上:WHERE在GROU BY之前,HAVING在之后
  • 执行计划:WHERE使得限制发生在分组之前,HAVING是在分组之后
  • 效率上:使用WHERE使得目标结果集更小,分组汇总的效率高;使用HAVING时,结果集不变,WHERE效率更高
  • 其他:WHERE可以使用表中的任意字段进行限制,而HAVING必须是SELECT后面的字段