# P38 38. 基础-多表查询-概述

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

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

## P38 38. 基础-多表查询-概述

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=38（p=38），时长 8:04
- 讲义：5.2 多表查询概述（含 5.2.1 数据准备） p72–75（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

多表查询就是把两张表放在一起查。不写连接条件，MySQL 会把每行都和对方每行配一次，得到笛卡尔积——大部分行没有意义。

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

视频先跑 `select * from emp, dept`，把 17×6 的笛卡尔积摊开，再补 `where emp.dept_id = dept.id`。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp 17 行、dept 6 行 | employee 4 行、department 3 行（本站原创小表） |
| emp.dept_id / dept.id | employee.dept_id / department.id（关系相同） |

看完应能：能说出 4×3=12 行为什么出现、加哪一句能消掉无意义的组合

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

### 步骤

1. 先看两张表各自的规模。4 名员工 × 3 个部门 = 12 行，这就是不加条件的全部组合；行数相乘是判断“有没有漏写条件”的最快信号。
2. 再用连接条件筛掉乱配的行。员工表的 dept_id 和部门表的 id 相等，才说明这名员工属于这个部门，12 行立刻剩 3 行。
3. 连接条件写在 WHERE（隐式）或 ON（显式）都行，效果一样；差别在可读性，以及外连接时条件必须放 ON。
4. 最后记住分类：内连接、外连接、自连接、子查询。前三个是“怎么把表拼起来”，子查询是“先算一个结果再用”。

### SQL 示例

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

-- 故意不写连接条件：4 × 3 = 12 行
SELECT e.name AS 员工, d.name AS 部门
FROM employee e, department d;

-- 补上连接条件：只剩 3 行
SELECT e.name AS 员工, d.name AS 部门
FROM employee e, department d
WHERE e.dept_id = d.id;
```

说明：第一条返回 12 行，小林会分别配上研发部、测试部、运营部，明显是错配。第二条只剩 3 行：小林-研发部、小周-研发部、小陈-测试部。小李的 dept_id 是 NULL，NULL = 任何值都不成立，所以他不出现——这是内连接的正常行为，不是丢数据。

### 易错点

- 只写 FROM a, b 忘写 WHERE，结果行数突然变成两表行数之积；先数行数，再找条件。
- 想把无部门的员工也留下，却仍在用 WHERE 内连接，做不到；要改用 LEFT JOIN。
- 两表有同名列（都叫 name）时不用别名区分，会报 column ambiguous。

### 30 秒速记

多表=先组合再筛选；不写条件=笛卡尔积；连接条件把 4×3 变 3；内连接丢掉不匹配行。

### 自测

1. 4 行员工、3 行部门，不写连接条件返回几行？
   - 答：12 行，行数相乘；写了 dept_id = id 后是 3 行。
2. 小李为什么不出现在内连接结果里？
   - 答：他的 dept_id 是 NULL，与任何 id 比较都不为真，匹配不上；要保留他用 LEFT JOIN。

### 材料与来源

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

证据说明：本集无逐字稿（匿名 player/v2 返回 subtitles=[]、need_login_subtitle=true），并以讲义公开镜像讲义 5.2 多表查询概述（p72–75）核对章节与主题；画面静帧只用于确认场景，不是内容边界。示例表与数据为本笔记自建，不是课程原表；不含原始帧或字幕。
