mysql 区分where和having的应用场景

背景:以前主要应用到的都是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去限制分组后没有的信息,否则铁定会报错.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值