1.什么是分组查询?
在实际的开发中,可能需要先对一组数据进行分组,然后再对每一组的数据进行操作,这时需要用到分组查询
2.分组查询的语法
select...from...group by...
例如:计算每个部门的工资和?计算每个工作岗位的平均薪资?计算每个工作岗位的最高薪资?
3.关键字的执行顺序问题
select(4)...from(1)...where(2)...group by(3)...order by(5)...//顺序不能颠倒,需要记忆
4.(1)找出每个工作岗位的工资和
实现思路:先按照工作岗位进行分组,然后对工资求和
select sum(sal) as sumsal from emp group by job;
执行顺序:from emp表中查询数据,group by以job分组,最后对每一组数据进行sum求和输出
(2)找出每个工作部门,不同工作岗位的工资和
select deptno,job, max(sal) from emp group by deptno,job;//两个字段联合分组
5.!!!重要结论:
在一条select语句当中,如果有group by语句的话,select后面只能跟参加分组的字段和分组函数,其他的一律不能跟
例如:select ename,job,sum(sal) as sumsal from emp group by job;
可以跟分组数据job和分组函数sum(),但是不能跟ename,虽然在低版本MySQL中可以正常输出,但是这样写没有意义,并且在高版本MySQL和Oracle里面会报错误
6.找出每个部门最高工资>3000的
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;//先用where过滤,再分组
优化策略:where和having优先选择where,where实在不能完成的,再选择having
注意:group by语句只能用在where之后,如果分组完之后需要对数据进行进一步的过滤需要使用having语句,having不能代替where,必须和group by同时使用
7.where没办法完成过滤的?
找出每个部门的平均薪资,要求显示平均薪资>2000
select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;