mysql分组查询 group by和having

grouop by: 按照某个字段或者某些字段进行分组。
having”:having是对分组之后的数据进行再次过滤。
having 是group by 的搭档。没有后者就没有前者



**注意:**分组函数一般都会和group by联合使用。这也是分组函数名字的由来。


当一条sql语句没有group by的话,整张表的数据就会自成一组。
因为group by是在where执行之后才会执行的,所以where语句不能使用分组函数,要分完组之后才能使用分组函数。
例子:

第一步:找出平均工资
select avg(sal) from emp;

第二部:找出高于平均工资的员工。
select ename,sal from emp where sal > 2073.214286;

二合一:
select ename,sal from emp where sal > (select avg(sal) from emp;);

查出每个工种的最高薪资:
select max(sal),job from emp group by job;

/
重点!:当一条sql语句包含group by分组语句的话,select后面必须跟参加分组的字段!或者分组函数

每个岗位的平均薪资:
select job,avg(sal) from emp group by job;
.
.
多个字段能不能联合起来一块分组?
**案例:**找出每个部门不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp group by deptno ,job;
/
案例:找出每个部门的最高薪资,要求显示大于2500的数据 :

select deptno,max(sal) from emp group by deptno having max(sal) > 2900;//效率低

select deptno,max(sal) from emp where sal > 2900 group by deptno;
效率高,因为上面那条是分好组然后去掉低于2900的,下面这个是直接把低于2900的过滤掉了,所以高效。 但是结果都是一样的。

所以建议能使用where 过滤的,就是用where过滤


案例:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;

这条就不能用 where ,因为这是求平均数,where会在group by 之前执行会提前过滤数据,所以会造成求得平均数不对。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值