# P39 39. 基础-多表查询-内连接

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

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

## P39 39. 基础-多表查询-内连接

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=39（p=39），时长 8:15
- 讲义：5.3 内连接 p75–77（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

内连接只保留两张表能对上的行：员工有部门才出现，部门有员工才出现。

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

视频演示内连接的两种写法：`from emp, dept where …` 与 `inner join … on …`。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp.name / emp.age / dept.name | employee.name / employee.age / department.name |
| emp.dept_id = dept.id | employee.dept_id = department.id |

看完应能：两种写法都能写出来，并知道它们结果相同

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

### 步骤

1. 先确定连接条件：employee.dept_id = department.id。这是“员工属于哪个部门”的唯一依据，条件写错会得到看似正常其实错位的结果。
2. 隐式写法把两张表用逗号并列，条件放 WHERE。老教材和简写常用，表一多就容易漏条件。
3. 显式写法用 INNER JOIN ... ON，连接条件和过滤条件分家。推荐这种：ON 只写“怎么对上”，WHERE 只写“要哪些行”，读起来不容易混。
4. 写完对一下行数。4 名员工里只有 3 人有部门，内连接就该是 3 行；多出来通常是漏了条件，少了则要查 dept_id 是否为空。另外，ON 里别写 e.age < 30 这类过滤——内连接结果一样，换成外连接就会保留不该保留的行。

### SQL 示例

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

SELECT e.name AS 员工, e.age AS 年龄, d.name AS 部门
FROM employee e
INNER JOIN department d ON e.dept_id = d.id
ORDER BY e.id;
```

说明：返回 3 行：小林 22 研发部、小周 25 研发部、小陈 30 测试部。ON 负责把 dept_id 和 id 对上；ORDER BY e.id 只是让结果顺序稳定。把 INNER JOIN 换成“employee e, department d WHERE e.dept_id = d.id”，输出一模一样。 去掉 ORDER BY 再跑，行序可能变，但行集合不变：排序只影响展示。

### 易错点

- ON 写成 e.dept_id = d.name，类型和含义都错，却不一定报错，只会得到空结果或错配。
- 把过滤条件写进 ON 而不是 WHERE，在内连接里结果相同，但换成外连接含义就变了，别养成习惯。
- SELECT * 会带出两张表的全部列，同名列看起来重复；初学先显式写字段。
- 给表起了别名后，就不能再用原表名指字段：`SELECT e.name … FROM employee e` 里写 `employee.name` 会报 Unknown column。

### 30 秒速记

内连接=交集；隐式逗号+WHERE，显式 JOIN+ON；匹配不上的行直接消失。

### 自测

1. 内连接和外连接最根本的区别？
   - 答：内连接丢弃匹配不上的行；外连接保留某一侧全部行，另一侧用 NULL 补。
2. 两种内连接写法结果会不同吗？
   - 答：不会，结果相同，只是条件位置和可读性不同。
3. 内连接会不会返回重复行？
   - 答：会；一对多时一条左表记录匹配多行就会重复，需要按业务去重或聚合。

### 材料与来源

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