1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
什么是分组查询? 在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。 这个时候我们需要使用分组查询,怎么进行分组查询呢? select ... from ... group by ... 计算每个部门的工资和? 计算每个工作岗位的平均薪资? 找出每个工作岗位的最高薪资? .... |
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 |
将之前的关键字全部组合在一起,来看一下他们的执行顺序? select ... from ... where ... group by ... order by ... 以上关键字的顺序不能颠倒,需要记忆。 执行顺序是什么? 1. from 2. where 3. group by 4. select 5. order by 为什么分组函数不能直接使用在where后面? select ename,sal from emp where sal > min(sal);//报错。 因为分组函数在使用的时候必须先分组之后才能使用。 where执行的时候,还没有分组。所以where后面不能出现分组函数。 select sum(sal) from emp; 这个没有分组,为啥sum()函数可以用呢? 因为select在group by之后执行。 |
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 29 30 31 32 33 34 35 36 |
/* 找出每个工作岗位的工资和? 实现思路:按照工作岗位分组,然后对工资求和。 select job,sum(sal) from emp group by job; */ mysql> select -> job,sum(sal) -> from -> emp -> group by -> job; +-----------+----------+ | job | sum(sal) | +-----------+----------+ | ANALYST | 6000.00 | | CLERK | 4150.00 | | MANAGER | 8275.00 | | PRESIDENT | 5000.00 | | SALESMAN | 5600.00 | +-----------+----------+ /* 以上这个语句的执行顺序? 先从emp表中查询数据。 根据job字段进行分组。 然后对每一组的数据进行sum(sal) 重点结论: 在一条select语句当中,如果有group by语句的话, select后面只能跟:参加分组的字段,以及分组函数。 其它的一律不能跟。 */ |
1 2 3 4 5 6 7 8 9 10 11 12 |
//找出每个部门的最高薪资 //实现思路是什么? //按照部门编号分组,求每一组的最大值。 mysql> select deptno,max(sal) from emp group by deptno; +--------+----------+ | deptno | max(sal) | +--------+----------+ | 10 | 5000.00 | | 20 | 3000.00 | | 30 | 2850.00 | +--------+----------+ |
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//找出“每个部门,不同工作岗位”的最高薪资? +--------+-----------+---------+--------+ | ename | job | sal | deptno | +--------+-----------+---------+--------+ | MILLER | CLERK | 1300.00 | 10 | | KING | PRESIDENT | 5000.00 | 10 | | CLARK | MANAGER | 2450.00 | 10 | | FORD | ANALYST | 3000.00 | 20 | | ADAMS | CLERK | 1100.00 | 20 | | SCOTT | ANALYST | 3000.00 | 20 | | JONES | MANAGER | 2975.00 | 20 | | SMITH | CLERK | 800.00 | 20 | | BLAKE | MANAGER | 2850.00 | 30 | | MARTIN | SALESMAN | 1250.00 | 30 | | ALLEN | SALESMAN | 1600.00 | 30 | | TURNER | SALESMAN | 1500.00 | 30 | | WARD | SALESMAN | 1250.00 | 30 | | JAMES | CLERK | 950.00 | 30 | +--------+-----------+---------+--------+ /* 技巧:两个字段联合成1个字段看。(两个字段联合分组) select deptno, job, max(sal) from emp group by deptno, job; */ mysql> 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 | +--------+-----------+----------+ |