MYSQL笔记-关于分组查询中的where和having效率问题

MYSQL笔记-关于分组查询中的where和having效率问题

前言

最近在学习SQL语法时,遇到了一个where和having的效率问题,感觉非常值得注意,所以记录下来便于复习和与各位网友分享。


结论放前面

时间紧迫的同学可以直接看结论,where和having都可以达到对分组查询后的结果再过滤的目的,但在任何情况下请优先考虑使用where,where处理不了的再使用having,因为where的效率更高


情景

现在有一张表emp,存储的数据分别为empno(员工编号),ename(员工姓名),job(岗位),mgr(上级领导工号),hiredate(入职日期),sal(工资),comm(补贴),depto(部门编号)。
在这里插入图片描述


要求1:找出每个部门最高薪资
解答:可以很容易的写出sql语句select deptno,max(sal) from emp group by deptno;
在这里插入图片描述


要求2:找出每个部门最高薪资,显示其中大于等3000的。
解答1:select deptno,max(sal) from emp group by deptno having max(sal) >= 3000;
解答2:select deptno,max(sal) from emp where sal >= 3000 group by deptno;

使用以上2条sql语句都能得到结果:
在这里插入图片描述


问题

select deptno,max(sal) from emp group by deptno having max(sal) >= 3000;
select deptno,max(sal) from emp where sal >= 3000 group by deptno;
以上两条语句的操作过程是怎么样的?效率是否有区别?

1、select deptno,max(sal) from emp group by deptno having max(sal) >= 3000;
先按照分组查询emp表中的全部数据,显示出每一个deptno中最大的sal,再执行having语句筛选分组查询结果中大于等于3000的数据。
分组时给到了分组查询操作表内所有数据,然后再对分组查询结果进行筛选。

2、select deptno,max(sal) from emp where sal >= 3000 group by deptno;
先对emp表中的数据进行筛选选出其中sal大于等于3000的,再按照分组查询显示每一个deptno中最大的sal。
分组时直接给到了表中符合要求的数据,分组查询结果就是我们要的结果。

结论

很明显,使用where的语句执行过程中减少了最后对分组查询结果的二次筛选,使得sql语句的效率比使用having更高,因此在开发过程中我们要有意识优先使用where来解决分组查询结果筛选的问题

但是,当筛选条件为需使用到分组函数时我们就只能使用having来做二次筛选,因为sql查询语句中的执行顺序为:1. from 2. where 3. group by 4. select 5. order by。在group by分组前无法使用分组函数,所以二次筛选条件自然不能写在where中。
就像下面的这个情景:找出每个部门平均薪资,要求显示平均薪资高于2500的数据。
就只能使用having来解决问题:select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;
在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值