WHERE和HAVING的区别(性能)

HAVING是对结果进行筛选 所以筛选前要确定前面的查询结果有对应的字段 where是针对from后的表进行筛选

WHERE在计算前(比如查询之前)过滤,可减少计算量。

比如:SELECT dt,COUNT(id) cnt FROM db.tb WHERE dt = ‘2020-01-17’ GROUP BY dt,这样只有2020-01-17日的数据参与了计算。

HAVING对计算结果过滤,就是计算完了再过滤。

比如:SELECT dt,COUNT(id) cnt FROM db.tb GROUP BY dt HAVING dt = ‘2020-01-17’

等同于:SELECT * FROM ( SELECT dt,COUNT(id) cnt FROM db.tb GROUP BY dt ) t WHERE dt = ‘2020-01-17’

即HAVING等同于在查询的外面套一层再加WHERE。

这样显然所有日期的数据都参与了计算,计算完了之后,再把2020-01-17的数据筛出来。

如果你有一年的数据,显然就白白多计算了364天的数据

这种里面加WHERE就能解决的事,非要在外面加WHERE(即HAVING),浪费计算资源不说,等待时间还长,纯粹受累不讨好。

所以,只有当在直接使用WHERE解决不了问题的时候,才考虑用HAVING

比如,查询数据量>100的日期。

上面那个例子中的cnt其实就是数据量,你直接用WHERE是无法达到目的。

只能:SELECT dt FROM ( SELECT dt,COUNT(id) cnt FROM db.tb GROUP BY dt ) t WHERE cnt >100

使用HAVING可以更精简,即

SELECT dt FROM db.tb GROUP BY dt HAVING COUNT(id) > 100

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值