MySQL基础知识—分组查询

介绍

实际应用中,可能有这样的需求,要先进行分组,然后对每一组的数据进行操作,这时就需要用到分组查询。

select
   ....
from
   ....
group by
   ....

例如:

​ 计算每个部门的工资和?

​ 计算每个工作岗位的平均薪资?

关键字组合

将之前学习的关键字组合起来,它们的执行顺序如下:

select
   ....
from
   ....
where
   ....
group by
   ....
having
   ....
order by
   ....

执行顺序:

from------> where -------> group by-------->having---------> select----------> order by

案例1

题目:找出每个部门,不同工作岗位的最高薪资?

思路:按照“部门和工作岗位”联合字段进行分组,然后求最高薪资。

语句:

select
   deptno,job,max(sal)
from
   EMP
group by
   deptno,job;

执行顺序:

  • 从EMP表中查询数据
  • 根据job和deptno字段联合字段进行分组
  • 对每一组的数据进max(sal)求最高薪资。

image-20210905095401588

结论:在select语句中,如果有group by语句,select后只能跟分组字段和分组函数。

案例2

题目:找出每个部门的最高薪资,并且要求显示最高薪资大于3000的。

思路:

​ 1、找出每个部门的最高薪资

select deptno,max(sal) from EMP group by deptno;

​ 2、按照要求显示最高薪资大于3000

方法一:

【注意】:这里可以使用having对分完组之后的数据进一步进行过滤,但是having不能单独使用,不能代替where,必须和group by联合使用。

select deptno,max(sal) from EMP group by deptno having max(sal) > 3000;

image-20210905100314866

思考:上述方法是先进行分组后再找出大于3000的,这样的效率是不是低呢?

方法二:

思路:先找出薪资大于3000的,然后再进行分组。

select deptno,max(sal) from EMP where sal > 3000 group by deptno;

image-20210905100552815

【优化策略】where和having优先选择where,where实在完成不了了再用having。例如:找出每个部门平均薪资,要求显示平均薪资高于2500的,这里就没有办法用where。

猜你喜欢

转载自blog.csdn.net/kuangd_1992/article/details/120111514