【37-39】子查询
2022-02-11 14:17:00 # MySQL

概述

子查询是什么

select语句嵌套select语句,被嵌套的select语句是子查询

子查询出现在哪里

1
2
3
4
5
6
select
..(select).
from
..(select).
where
..(select).

嵌套子查询

找出高于平均薪资员工 where嵌套子查询

1
2
3
select * from emp where sal > (
select avg(sal) from emp
);

找出每个部门平均薪水的薪资等级 from嵌套子查询

找出每个部门平均薪水

1
2
3
4
5
6
7
8
9
mysql> select deptno, avg(sal) avgsal from emp group by deptno;
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 20 | 2175.000000 |
| 30 | 1566.666667 |
| 10 | 2916.666667 |
+--------+-------------+
3 rows in set (0.00 sec)

最终sql

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select tmp.*, s.grade
-> from (select deptno, avg(sal) avgsal from emp group by deptno) tmp
-> join salgrade s
-> on tmp.avgsal between s.losal and s.hisal;
+--------+-------------+-------+
| deptno | avgsal | grade |
+--------+-------------+-------+
| 20 | 2175.000000 | 4 |
| 30 | 1566.666667 | 3 |
| 10 | 2916.666667 | 4 |
+--------+-------------+-------+
3 rows in set (0.00 sec)

找出每个部门的薪资等级的平均值

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select e.deptno, avg(s.grade)
-> from emp e
-> join salgrade s
-> on e.sal between s.losal and s.hisal
-> group by e.deptno;
+--------+--------------+
| deptno | avg(s.grade) |
+--------+--------------+
| 20 | 2.8000 |
| 30 | 2.5000 |
| 10 | 3.6667 |
+--------+--------------+
3 rows in set (0.00 sec)

找出每个员工所在的部门名称 select嵌套子查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> select e.ename, (
-> select d.dname from dept d where e.deptno = d.deptno
-> ) dname
-> from emp e;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)
Prev
2022-02-11 14:17:00 # MySQL
Next