# P42 42. 基础-多表查询-联合查询union

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

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

## P42 42. 基础-多表查询-联合查询union

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=42（p=42），时长 5:48
- 讲义：5.5.2 联合查询 p79–80（公开镜像；按主题对应，切点 notexact）

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

### 一句话理解

连接横向拼列，UNION 纵向接行。UNION 去重，UNION ALL 不去重、更快。

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

视频用 UNION / UNION ALL 把两段查询纵向接起来，并说明去重差异。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| 讲义：工资 <5000 与 >20000 两段 UNION | 本站：同一写法换成 4 行小表的两段条件 |
| UNION 去重 / UNION ALL 保留重复 | 同左（语法与行为一致） |

看完应能：能说清 UNION 与 UNION ALL 差在去重，以及两段查询的列数、类型要对齐

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

### 步骤

1. 先保证两条 SELECT 列数一样、对应列类型能相容。列数不同直接报错（ERROR 1222），类型不相容会隐式转换或丢精度。 比如 INT 和 VARCHAR 合并，MySQL 会先转成同一类型再比，结果可能出乎意料。
2. 要“合并后不重复”用 UNION：它把完全相同的整行去掉，代价是多一次去重。
3. 确定不会有重复、或就是要保留重复（比如两批统计各自的行）用 UNION ALL，省掉去重开销。
4. ORDER BY 写在最后一条 SELECT 之后，作用于整个合并结果；只给第一条写排序没有意义。

### SQL 示例

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

-- 去重：小周只留一次
SELECT name FROM employee WHERE age >= 25
UNION
SELECT name FROM employee WHERE dept_id = 1;

-- 保留重复：小周出现两次
SELECT name FROM employee WHERE age >= 25
UNION ALL
SELECT name FROM employee WHERE dept_id = 1;
```

说明：第一段左边是小周、小陈，右边是小林、小周；UNION 去掉重复的小周，3 行。第二段同样的数据用 UNION ALL，4 行，小周出现两次。判断重复的依据是“整行完全相同”，不是只看某一列。 列名取第一条 SELECT 的别名，第二条写什么别名都不影响输出表头。

### 易错点

- UNION 只去“整行重复”；两行只要有一列不同就都保留。
- 两边列数不等报 ERROR 1222；用 SELECT * 时表结构一变就可能踩到，明确写列名。
- 拿 UNION 去拼含义不同的列（比如员工名接部门名），语义会乱；横向关联用 JOIN。
- UNION 的列名只认第一条 SELECT，第二条的别名不会生效，别指望它改表头。

### 30 秒速记

UNION 纵接行、去重；UNION ALL 保留重复；列数列型要对齐；ORDER BY 放最后。

### 自测

1. UNION 和 UNION ALL 的区别？
   - 答：UNION 对合并结果去重，UNION ALL 原样保留所有行、开销更小。
2. 两条 SELECT 列数不同会怎样？
   - 答：报 ERROR 1222，UNION 要求列数一致、类型相容。
3. 两条 SELECT 的列顺序不同能 UNION 吗？
   - 答：能执行，但会按位置硬拼，A 的姓名接到 B 的部门上，语义就错了；列顺序必须人工对齐。

### 材料与来源

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

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