SQL分组中WHERE和HAVING的异同

当我们使用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后面的字段

猜你喜欢

转载自dx871021.iteye.com/blog/2310776