| 特性 | UNION | UNION ALL |
|---|---|---|
| 重复数据处理 | 自动去重,返回唯一记录 | 保留所有记录,包括重复的 |
| 性能 | 较慢(需要排序和去重) | 较快(直接合并结果集) |
| 结果排序 | 默认不保证顺序,除非使用ORDER BY | 默认不保证顺序,除非使用ORDER BY |
| 语法 | UNION | UNION ALL |
-- 示例数据
表A: 1, 2, 3, 4
表B: 3, 4, 5, 6
-- UNION: 去重
SELECT id FROM A
UNION
SELECT id FROM B
-- 结果: 1, 2, 3, 4, 5, 6 (7行)
-- UNION ALL: 保留所有
SELECT id FROM A
UNION ALL
SELECT id FROM B
-- 结果: 1, 2, 3, 4, 3, 4, 5, 6 (8行)
2. 性能影响
-- 性能测试示例
-- UNION ALL (推荐,如果不需要去重)
SELECT * FROM users_active
UNION ALL
SELECT * FROM users_inactive;
-- UNION (只有当需要去重时使用)
SELECT user_id FROM orders_2023
UNION
SELECT user_id FROM orders_2024;
3. 使用场景
使用 UNION ALL 的情况:
使用 UNION 的情况:
-- 场景1:统计所有员工(包括在职和离职,可能有重复)
SELECT employee_id, name FROM current_employees
UNION ALL -- 可能有员工离职后又复职
SELECT employee_id, name FROM former_employees;
-- 场景2:获取不同的产品类别
SELECT category FROM products_electronics
UNION -- 确保类别不重复
SELECT category FROM products_furniture;
-- 场景3:分页查询合并(高效)
(SELECT id, name, created_at FROM table1 ORDER BY created_at DESC LIMIT 10)
UNION ALL
(SELECT id, name, created_at FROM table2 ORDER BY created_at DESC LIMIT 10)
ORDER BY created_at DESC LIMIT 10;
优先考虑 UNION ALL
明确需求
注意点
-- 假设每表有100万条数据
-- UNION: 需要处理200万条数据并去重
-- 执行时间: ~2.5秒
-- UNION ALL: 只需合并200万条数据
-- 执行时间: ~0.8秒
结论:除非明确需要去重,否则应优先使用 UNION ALL 以获得更好的性能。