SQL UNION 合并
学习 UNION 和 UNION ALL · 难度:进阶 · +15XP
SQL UNION 合并查询结果
在数据库查询中,有时需要将多个 SELECT 语句的结果合并为一个结果集。例如,你需要同时查询两个部门中绩效优秀的员工,或者汇总不同年份的销售数据。SQL 提供了 UNION 和 UNION ALL 操作符来实现结果集的纵向拼接。两者的核心区别在于:UNION 会自动去重,而 UNION ALL 保留所有行(包括重复)。
UNION 基本语法
SELECT 列1, 列2, ... FROM 表1
UNION [ALL]
SELECT 列1, 列2, ... FROM 表2
ORDER BY 列名;
关键规则:所有 SELECT 语句必须有相同数量的列,且对应列的数据类型必须兼容。列名以第一个 SELECT 语句为准。
UNION 示例
-- 合并两个查询结果并去重
SELECT name FROM students WHERE score >= 85
UNION
SELECT name FROM students WHERE age <= 20
ORDER BY name;
-- 使用 UNION ALL 保留所有行(不去重)
SELECT name FROM students WHERE score >= 85
UNION ALL
SELECT name FROM students WHERE age <= 20;
UNION vs UNION ALL 性能对比
| 特性 | UNION | UNION ALL |
|---|---|---|
| 去重 | 是(自动去除重复行) | 否(保留所有行) |
| 性能 | 较慢(需排序+去重) | 较快(直接拼接) |
| 适用场景 | 需要保证结果唯一性 | 确定无重复或允许重复 |
不同列数时的处理
如果两个 SELECT 的列数不同,可以用 NULL 或常量补齐:
-- 表A有3列,表B只有2列,用NULL补齐
SELECT id, name, score FROM students
UNION
SELECT id, name, NULL FROM alumni; -- 补齐第三列
ORDER BY 的位置
UNION 的排序必须放在最后一个 SELECT 之后,对整个合并结果排序:
SELECT name, score FROM class_a
UNION
SELECT name, score FROM class_b
ORDER BY score DESC; -- 对整个合并结果排序
常见使用场景
- 多表汇总:汇总多个结构相似的表(如各年份销售表)
- 多条件查询合并:将不同条件的查询结果拼接展示
- 报表生成:交叉统计多个维度数据后合并为统一格式
- 数据迁移校验:对比源表和目标表的差异
实战任务
- 将分数>=85和年龄<=20的学生姓名合并为一个列表
- 对比 UNION 和 UNION ALL 的结果差异
- 合并两个不同表(如 students 和 archive_students)的数据