UNION 与 UNION ALL 的区别
参考回答
UNION
和 UNION ALL
都用于合并多个 SELECT
语句的查询结果,但它们有以下区别:
1. 主要区别
特性 | UNION | UNION ALL |
---|---|---|
去重操作 | 会对合并结果进行去重 | 不会去重,保留所有结果 |
性能 | 因为有去重操作,性能较低 | 无需去重操作,性能较高 |
结果记录数 | 去重后可能小于两个查询结果的总和 | 结果记录数等于两个查询结果的总和 |
应用场景 | 需要去重的场景 | 不需要去重或允许重复的场景 |
2. 示例
假设有两张表:table1
和 table2
,内容如下:
table1
:
id | name |
---|---|
1 | Alice |
2 | Bob |
table2
:
id | name |
---|---|
2 | Bob |
3 | Carol |
示例 1:使用 UNION
SELECT id, name FROM table1
UNION
SELECT id, name FROM table2;
结果:
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Carol |
- 说明:
UNION
去除了重复的行(id = 2, name = 'Bob'
)。
示例 2:使用 UNION ALL
SELECT id, name FROM table1
UNION ALL
SELECT id, name FROM table2;
结果:
id | name |
---|---|
1 | Alice |
2 | Bob |
2 | Bob |
3 | Carol |
- 说明:
UNION ALL
保留了所有重复行。
3. 性能比较
UNION
的性能:- 在合并结果后,
UNION
会对数据进行排序并去重。 - 需要额外的资源(CPU 和内存)来处理排序和去重操作,性能较低。
- 在合并结果后,
UNION ALL
的性能:- 直接合并结果,不进行排序和去重操作。
- 性能更高,适合不需要去重的场景。
4. 选择建议
- 使用
UNION
的场景:- 需要去重,保证结果集中每条记录唯一。
- 如:需要展示唯一的用户或唯一的商品列表。
- 使用
UNION ALL
的场景:- 允许重复数据或数据本身已确定无重复时。
- 如:日志合并、统计场景(比如总记录数或明细数据)。
5. 小结
UNION
:合并结果并去重,保证数据唯一,但性能较低。UNION ALL
:直接合并结果,保留重复数据,性能更高。
在实际使用中,应根据业务需求选择适合的操作。若不需要去重,建议优先使用 UNION ALL
以提高性能。