1. 核心概念
UNION 和 UNION ALL 都用于将两个或多个 SELECT 语句的结果集合并成一个结果集。
2. 关键区别
2.1 功能差异
- UNION:对合并后的结果集进行去重(Distinct)。即如果两张表有完全相同的行,
UNION后只会保留一行。 - UNION ALL:直接合并结果集,不去重。如果两张表有相同的行,都会显示出来。
2.2 性能差异 (关键考点)
- UNION:
- MySQL 需要创建一个临时表(Temporary Table)。
- 将结果存入临时表,并对临时表建立唯一索引或进行排序来实现去重。
- 开销大,CPU 和 内存消耗高。
- UNION ALL:
- 不需要临时表,不需要排序去重。
- 只是简单地将结果追加返回给客户端。
- 效率极高。
3. 最佳实践
原则:能用 UNION ALL 就绝不用 UNION。
即使你需要去重,如果能确认两个结果集本身就没有交集(例如一个查 id < 10,一个查 id > 20),也应该强制使用 UNION ALL,因为它省去了昂贵的排序和去重开销。
4. 总结
| 特性 | UNION | UNION ALL |
|---|---|---|
| 去重 | ✅ 是 | ❌ 否 |
| 排序 | 可能发生 (为了去重) | ❌ 无 |
| 效率 | 低 (需临时表) | 高 |
| 适用场景 | 必须去重且无法预知重复 | 确定无重复 或 允许重复 |
面试回答示例: “UNION 会对结果集进行去重,这涉及到创建临时表和排序,性能较差。 UNION ALL 只是简单的结果合并,不去重,性能最好。 在开发中,只要业务允许(或者能确定数据不重复),我一律使用 UNION ALL 来提升查询效率。”