背景:以前主要应用到的都是where语句进行过滤,因为对于having的应用场景很模糊,用的也少.所以在做一些统计的时候也是先group by分组,统计出基础数据后作为临时表再进行一次查询,从而获得自己想要的信息.
例子:获取用户表中一个手机号对应两个以上用户的数据信息
SELECT * FROM
(SELECT mobile,COUNT(1) AS num
FROM `user`
GROUP BY mobile) AS t
WHERE t.num>1
这样的查找会查询临时表再在临时表中过滤,但如果改成having的时候,就可以直接在分组后,过滤分组信息获取到数据了
SELECT mobile,count(1) AS num
FROM `user`
GROUP BY mobile
HAVING num > 1
测试两条sql的执行时间的时候使用having的用了5s,使用where的用了13s(mobile字段没有创建索引,创建后应该都会变快些)
备注:
1.由以上的例子可以看出在一些场景下使用having还是要优于where的
2.where的条件过滤主要针对的是表(或临时表)中已经存在的字段来进行过滤,having的条件则是针对group by 分组后的信息进行过滤(最好的话能将分组后要取的信息取个别名,解读起来比较方便,书写having过滤条件时也比较清楚)
3.虽然where和having基本上可以换着用,但是千万不要用where限制表中不存在的字段,也不要用having去限制分组后没有的信息,否则铁定会报错.