1. 核心概念

UNIONUNION 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 来提升查询效率。”