SQL分组中WHERE和HAVING的异同

本文探讨了在SQL中如何高效地使用GROUP BY进行数据分组,并比较了使用WHERE子句与HAVING子句在执行效率上的差异。通过具体案例说明了在不同场景下选择合适方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们使用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时效率更高。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值