分组查询(非常重要)
19,分组查询
19.1、分组查询?
先进行分组,再对每一组的数据操作
select.. from... group by...
计算每个部门的工资和?
计算每个岗位的平均薪资?
计算每个工作岗位的最高薪资?
19.2、将之前的关键字全部组合在一起,看一下执行顺序?
select...from....where....group by...order by...
执行顺序:1from 2where 3group by 4select 5order by
为什么分组函数不能直接使用where后
分组函数在使用时必须先分组才能使用,where执行时还没分组,where后不能出现分组函数
select sum(sal) from emp; 因为select在group by之后执行
19.3、找出每个工作岗位的工资和?
思路:按照工作岗位分组,然后对工资求和
select job,sum(sal) from emp group by job;
先从emp表查询,根据job字段分组,对每一组数据进行sum(sal)
select ename,job,sum(sal) from emp group by job;该条语句在mysql中可以执行,但毫无意义ename有14条,job只有5条
在oracle中执行报错,oracle语法要严格一些
重点结论:在一条select语句中,如果有group by 语句的话,select后面只能跟:参加分组的字段,以及分组函数。
其它的一律不能跟
19.4、找出每个部门的最高薪资?
select deptno,max(sal) from emp group by deptno;
19.5、找出每个部门,不同工作岗位的最高薪资?
select ename,job,sal,deptno from emp;
技巧:两个字段联合成1个字段看(两个字段联合分组)
select deptno,job,max(sal) from emp group by deptno,job;
19.6、找出每个部门最高薪资,要求显示最高薪资大于3000的?
使用having可以对分完组之后的数据进一步过滤。
注意:having不能单独使用,having不能代替where,having必须和group by联合使用
第一步:select deptno,max(sal) from emp group by deptno;
第二步:select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
以上sql语句执行效率低
select deptno,max(sal) from emp where sal > 3000 group by deptno;
先将大于3000找出,再分组。
优化策略:where和having,优先选择where,where实在完成不了再用having
19.7、where没办法的??
找出每个部门平均薪资,要求显示平均薪资高于2500的。
第一步:select deptno,avg(sal) from emp group by deptno;
第二步:select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;