目录
分组查询(非常重要:五颗星*****)
1.什么是分组查询?
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询。
2.怎么进行分组查询呢?
select ... from ... group by ...
3.将之前的关键字全部组合在一起,来看一下他们的执行顺序?
select ... from ... where ... group by ... order by ...
以上关键字的顺序不能颠倒,需要记忆。
执行顺序是什么?
- from
- where
- group by
- select
- order by
4.为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal);//报错。
因为分组函数在使用的时候必须先分组之后才能使用。
where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum(sal) from emp; //这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。
5.找出每个工作岗位的工资和?
实现思路:按照工作岗位分组,然后对工资求和。
1. select job,sum(sal) from emp group by job;
以上这个语句的执行顺序?
先从emp表中查询数据。
根据job字段进行分组。
然后对每一组的数据进行sum(sal)
2. select ename,job,sum(sal) from emp group by job;
以上语句在mysql中可以执行,但是毫无意义。
以上语句在oracle中执行报错。
oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)
重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟参加分组的字段以及分组函数。
其它的一律不能跟。
6.找出每个部门的最高薪资
实现思路:按照部门编号分组,求每一组的最大值。
7.找出“每个部门,不同工作岗位”的最高薪资?
技巧:两个字段联合成1个字段看。(两个字段联合分组)
8.找出每个部门最高薪资,要求显示最高薪资大于3000的?
第一步:找出每个部门最高薪资
第二步:要求显示最高薪资大于3000
使用having可以对分完组之后的数据进一步过滤。
having不能单独使用,having不能代替where,having必须和group by联合使用。
思考一个问题:以上的sql语句执行效率是不是低?
执行顺序:from、group by、having、select
比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组。
优化策略:
where和having,优先选择where,where实在完成不了了,再选择having。
9.找出每个部门平均薪资,要求显示平均薪资高于2500的
where实现不了,使用having
第一步:找出每个部门平均薪资
第二步:要求显示平均薪资高于2500的