介绍
实际应用中,可能有这样的需求,要先进行分组,然后对每一组的数据进行操作,这时就需要用到分组查询。
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;
执行顺序:
扫描二维码关注公众号,回复:
13198602 查看本文章
- 从EMP表中查询数据
- 根据job和deptno字段联合字段进行分组
- 对每一组的数据进max(sal)求最高薪资。
结论:在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;
思考:上述方法是先进行分组后再找出大于3000的,这样的效率是不是低呢?
方法二:
思路:先找出薪资大于3000的,然后再进行分组。
select deptno,max(sal) from EMP where sal > 3000 group by deptno;
【优化策略】where和having优先选择where,where实在完成不了了再用having。例如:找出每个部门平均薪资,要求显示平均薪资高于2500的,这里就没有办法用where。