# P41 41. 基础-多表查询-自连接

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

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

## P41 41. 基础-多表查询-自连接

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=41（p=41），时长 8:30
- 讲义：5.5.1 自连接查询 p78–79（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

自连接就是一张表当两张用：给同一张表起两个别名，一个当员工、一个当上级，再按 manager_id = id 连起来。

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

视频用 managerid 把 emp 自己连自己，查「我的上级是谁」。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp.managerid → emp.id | employee.manager_id → employee.id |
| 讲义里张无忌的上级是金庸 | 本站小林、小陈的上级是 2 号小周 |

看完应能：能给同一张表起两个别名，并写出自连接条件

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

### 步骤

1. 先给同一张表两个身份。e 代表“我”，m 代表“我的上级”；不给别名，MySQL 分不清你要哪一行。 别名起得有含义（e 员工、m 上级），比 a、b 好排查。
2. 连接条件是 e.manager_id = m.id，即“我的上级编号 = 对方的员工编号”。这跟普通两表连接没区别，只是两张表恰好同名。
3. 顶层老板没有上级，manager_id 是 NULL。要把他留在结果里就用 LEFT JOIN；用内连接他会消失，看起来像“少了个人”。
4. 字段一律带别名前缀。同名列（两张表都叫 name、id）不带前缀会报 ambiguous，带上就清楚了。

### SQL 示例

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

SELECT e.name AS 员工, m.name AS 上级
FROM employee e
LEFT JOIN employee m ON e.manager_id = m.id
ORDER BY e.id;
```

说明：4 行：小林-小周、小周-NULL、小陈-小周、小李-小周。小周是老板，manager_id 为空，所以上级列是 NULL。把 LEFT 改成 INNER，只剩 3 行，小周整行不见——这是自连接最容易踩的坑。 把 ON 改成 e.id = m.manager_id，方向就反过来了，查的是“我的下属”，别名含义要跟着改。

### 易错点

- 两个别名写成同一个、或干脆不起别名，会报表名重复 / 字段 ambiguous。
- 用内连接查“所有员工及其上级”会漏掉没有上级的人；要全量必须 LEFT JOIN。
- 把 manager_id 理解成“部门编号”之类的别的字段，连接条件一错，结果会很整齐地错。

### 30 秒速记

自连接=同表两别名；e.manager_id=m.id；老板上级是 NULL；要全量用 LEFT JOIN。

### 自测

1. 自连接必须做什么？
   - 答：给同一张表起两个不同别名，并用别名区分字段。
2. 查“所有员工+上级”，内连接会少谁？
   - 答：少没有上级的人（如小周），因为 manager_id 为 NULL 匹配不上。
3. 自连接的两个别名可以互换吗？
   - 答：可以，但连接条件和字段含义要一起换；互换后查的是“我的下属”而不是“我的上级”。

### 材料与来源

- [平台视频页] BV1Kr4y1i7ru P41（平台标题） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=41
- [官方文档] 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.5.1 自连接查询（p78–79）核对章节与主题；画面静帧只用于确认场景，不是内容边界。示例表与数据为本笔记自建，不是课程原表；不含原始帧或字幕。
