UNION
和 UNION ALL
是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符,但它们在处理结果集的方式上有所不同。
UNION
-
去重:
UNION
操作符会合并两个或多个 SELECT 语句的结果集,并自动去除重复的行。如果两个或多个 SELECT 语句返回的结果集中有相同的行(即所有列的值都相同),那么这些重复的行在最终结果集中只会出现一次。 -
排序:默认情况下,
UNION
结果集中的行是不排序的,除非在最后一个 SELECT 语句中使用了ORDER BY
语句对结果集进行排序。需要注意的是,ORDER BY
只能应用于最后一个 SELECT 语句,并且会对整个UNION
结果集进行排序。 -
性能:由于
UNION
需要检查并去除重复的行,因此在处理大量数据时可能会比UNION ALL
慢。
UNION ALL
-
不去重:与
UNION
不同,UNION ALL
操作符会合并两个或多个 SELECT 语句的所有结果集,包括重复的行。如果两个 SELECT 语句返回了相同的行,这些行在最终结果集中都会保留。 -
性能:由于
UNION ALL
不需要检查重复的行,因此它比UNION
通常具有更好的性能,特别是在处理大量数据时。
示例
假设有两个表 students
和 graduates
,它们都有列 name
和 age
。
- 使用 UNION:
SELECT name, age FROM students
UNION
SELECT name, age FROM graduates;
这个查询会合并 students
和 graduates
表中的行,并去除任何重复的行。
- 使用 UNION ALL:
SELECT name, age FROM students
UNION ALL
SELECT name, age FROM graduates;
这个查询会合并 students
和 graduates
表中的所有行,包括重复的行。
结论
选择 UNION
还是 UNION ALL
取决于具体需求:如果需要去除重复的行,那么使用 UNION
;如果需要保留所有行,包括重复的,那么使用 UNION ALL
。在性能敏感的场景下,如果确定结果集中不会有重复行,使用 UNION ALL
可能会获得更好的性能。