关于分组查询(非常重要!!!) 什么是分组查询? 在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。这个时候我们需要使用分组查询。怎么进行分组查询呢?
语法基础 :
select … from … group by …
eg:计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?
关于执行顺序 select…from …where…group by…order by….
执行顺序是什么呢?
1.from
2.where
3.group by
4.select
5.order by
具体案例 1.找出每个工作岗位的工资和?
实现思路:按照工作岗位分组,然后对工资求和。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 MariaDB [hello]> select sum(sal),job from emp group by job; +----------+-----------+ | sum(sal) | job | +----------+-----------+ | 6000.00 | ANALYST | | 4150.00 | CLERK | | 8275.00 | MANAGER | | 5000.00 | PRESIDENT | | 5600.00 | SALESMAN | +----------+-----------+ 5 rows in set (0.001 sec) //以上语句的执行顺序? 先从emp表中查询数据,根据job字段进行分组,然后对每一组的数据进行sum(sal) MariaDB [hello]> select ename,job from emp group by job; +-------+-----------+ | ename | job | +-------+-----------+ | SCOTT | ANALYST | | SMITH | CLERK | | JONES | MANAGER | | KING | PRESIDENT | | ALLEN | SALESMAN | +-------+-----------+ 5 rows in set (0.001 sec) //以上语句在mysql中可以执行,但是毫无意义 //以上语句在oracle中执行报错。 //oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!) //ename有14条记录,而job只有5条,不匹配。
重点结论 : 在一条select语句当中,如果有group by 语句的话,select后面只能跟参加分组的字段以及分组函数,其他的一律不能跟。
2.找出每个部门,不同工作岗位的最高薪资?
技巧:两个字段联合成1个字段来看。(两个字段联合分组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 MariaDB [hello]> select deptno,job,max(sal)from emp group by deptno,job; +--------+-----------+----------+ | deptno | job | max(sal) | +--------+-----------+----------+ | 10 | CLERK | 1300.00 | | 10 | MANAGER | 2450.00 | | 10 | PRESIDENT | 5000.00 | | 20 | ANALYST | 3000.00 | | 20 | CLERK | 1100.00 | | 20 | MANAGER | 2975.00 | | 30 | CLERK | 950.00 | | 30 | MANAGER | 2850.00 | | 30 | SALESMAN | 1600.00 | +--------+-----------+----------+ 9 rows in set (0.001 sec) //逗号将deptno与job一起变成联合字段。
3.找出每个部门最高薪资,要求显示最高薪资大于3000的?
第一步:找出每个部门的最高薪资,按照部门编号进行分组,
第二步:要求显示最高薪资大于3000
1 2 3 4 5 6 7 MariaDB [hello]> select max(sal),deptno from emp group by deptno having max(sal)>3000; +----------+--------+ | max(sal) | deptno | +----------+--------+ | 5000.00 | 10 | +----------+--------+ 1 row in set (0.001 sec)
Ps:关于having语句:
使用having语句可以对分完组之后的数据进行进一步的过滤,having不能单独使用,having不能替代where,并且having必须和group by联合使用。
思考:以上的sql语句执行效率是不是低了?
实际上可以这样考虑:先将大于3000的都找出来,然后在进行分组。
1 2 3 4 5 6 7 8 MariaDB [hello]> select max(sal),deptno from emp where sal>3000 group by deptno; +----------+--------+ | max(sal) | deptno | +----------+--------+ | 5000.00 | 10 | +----------+--------+ 1 row in set (0.001 sec) //记住!!!!分组函数不能用在where后面!!!!!!!
Ps:但是也有where完成不了的语句
找出每个部门平均薪资,要求显示平均薪资高于2500的。
1 2 3 4 5 6 7 8 MariaDB [hello]> select deptno,avg(sal) from emp group by deptno having avg(sal)>2500; +--------+-------------+ | deptno | avg(sal) | +--------+-------------+ | 10 | 2916.666667 | +--------+-------------+ 1 row in set (0.001 sec) //where后面不能跟函数!!!!!!!只能用having。