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