mysql day08

关于分组查询(非常重要!!!)

什么是分组查询?

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。这个时候我们需要使用分组查询。怎么进行分组查询呢?

语法基础

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。

mysql day08
https://gaster44.github.io/2023/11/04/mysql-day08/
作者
huangjinhong
发布于
2023年11月4日
许可协议