# P43 43. 基础-多表查询-子查询介绍

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P43 43. 基础-多表查询-子查询介绍

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=43（p=43），时长 2:30
- 讲义：5.6.1 子查询概述 p80–81（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p43.sql（先执行，再对照小例）

### 一句话理解

子查询就是 SELECT 里再套一个 SELECT：先算出内层的结果，再拿给外层当条件或当一列。

### 跟播：视频里 ↔ 本站

视频先给四类子查询的分类图（标量 / 列 / 行 / 表）。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp / dept 两张表 | employee / department 两张表 |
| 子查询可以出现在 WHERE、SELECT、FROM | 同左（位置与表的行数无关） |

看完应能：看到一个子查询能先判断它返回什么形状，再决定用什么运算符

看视频时以讲义表为准，跟练时用本站表；结构相同、数字不同。

### 步骤

1. 先单独把内层跑一遍。看它返回“一个值、一列多行、一行多列、还是一张表”，这既是分类依据，也决定外层怎么接。
2. 再决定放哪里。WHERE 后面当条件最常见；SELECT 后面当一列（每行都带同一个值）；FROM 后面当临时表。 位置不同语义也不同：WHERE 里是过滤，SELECT 里是给每行加一列。
3. 最后检查外层能不能接得住。一个值可用 =、>；一列要用 IN；多列要用行比较；一张表必须放 FROM 并起别名。
4. 子查询不只能待在外层 SELECT 里，INSERT、UPDATE、DELETE 中同样可以嵌。

### SQL 示例

```
-- 表：department(1 研发部, 2 测试部, 3 运营部)
-- employee：小林22/研发8000/上级2，小周25/研发10000/无上级，小陈30/测试12000/上级2，小李21/无部门/NULL/上级2
-- 建表与插入语句见本页练习脚本 p43.sql（独立练习库 mysqlnotes_p43，跑一次就有这两张表）

SELECT name AS 员工, salary AS 工资,
       (SELECT AVG(salary) FROM employee) AS 公司平均
FROM employee
WHERE dept_id = 1;
```

说明：内层先算出全公司平均 10000（8000+10000+12000 除以 3，NULL 不参与）。外层查研发部两人，每行都带上这个 10000。预期 2 行：小林 8000 / 10000、小周 10000 / 10000。放在 SELECT 列表里的子查询必须是单值，返回多行会报错。 注意这个平均是整张表的，不随外层部门变化；要“本部门平均”，得把外层的 dept_id 传进内层，也就是后面的相关子查询。

### 易错点

- 内层返回多行却用 = 接，报 ERROR 1242（Subquery returns more than 1 row）。
- SELECT 列表里的子查询可能每行都算一次，数据量大时别滥用。
- 子查询不是越深越好；两层能解决就别套四层，可读性也是正确性的一部分。

### 30 秒速记

子查询=嵌套 SELECT；先看返回形状再选接法；WHERE/SELECT/FROM 三个位置；标量/列/行/表四类。

### 自测

1. 怎么判断该用标量还是列子查询？
   - 答：先单独跑内层看返回：一个值用标量比较，一列多行用 IN。
2. SELECT 后的子查询返回多行会怎样？
   - 答：报错，SELECT 列表位置要求单值。
3. 子查询放在 FROM 后面要注意什么？
   - 答：它会被当成派生表，MySQL 8 必须给别名，外层只能用别名引用它的列。

### 材料与来源

- [平台视频页] BV1Kr4y1i7ru P43（平台标题） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=43
- [官方文档] MySQL 8.0 Reference Manual — Subqueries https://dev.mysql.com/doc/refman/8.0/en/subqueries.html

证据说明：本集无逐字稿（匿名 player/v2 返回 subtitles=[]、need_login_subtitle=true），并以讲义公开镜像讲义 5.6.1 子查询概述（p80–81）核对章节与主题；画面静帧只用于确认场景，不是内容边界。示例表与数据为本笔记自建，不是课程原表；不含原始帧或字幕。 分类（标量/列/行/表）按后续四集标题与本节定义整理。
