UNION
是 SQL 中用于合并多个 SELECT
查询结果集的操作符。它会将多个查询的结果合并为一个结果集,并自动去除重复的行。以下是 UNION
的使用方法和注意事项。
使用方法
基本语法:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
示例:
假设有两个表 A
和 B
:
-
表
A
:id | name ---|----- 1 | Alice 2 | Bob
-
表
B
:id | name ---|----- 2 | Bob 3 | Charlie
使用 UNION
合并两个表的 name
列:
SELECT name FROM A
UNION
SELECT name FROM B;
结果:
name
-----
Alice
Bob
Charlie
注意事项
-
列数和数据类型必须匹配:
- 每个
SELECT
语句的列数必须相同。 - 对应列的数据类型必须兼容(例如,不能将字符串列与数字列合并)。
错误示例:
SELECT id FROM A UNION SELECT name FROM B; -- 错误:id 和 name 数据类型不匹配
- 每个
-
自动去重:
UNION
会自动去除重复的行。如果不需要去重,可以使用UNION ALL
。
示例:
SELECT name FROM A UNION ALL SELECT name FROM B;
结果:
name ----- Alice Bob Bob Charlie
-
性能问题:
UNION
会去重,因此需要对结果集进行排序和比较,可能会影响性能。- 如果不需要去重,尽量使用
UNION ALL
,因为它不会去重,性能更高。
-
列名规则:
- 最终结果集的列名由第一个
SELECT
语句的列名决定。 - 如果需要对列名进行重命名,可以在第一个
SELECT
语句中使用别名。
示例:
SELECT name AS full_name FROM A UNION SELECT name FROM B;
结果:
full_name --------- Alice Bob Charlie
- 最终结果集的列名由第一个
-
排序:
- 如果需要对合并后的结果集排序,只能在最后一个
SELECT
语句后添加ORDER BY
。 ORDER BY
只能使用最终结果集的列名。
示例:
SELECT name FROM A UNION SELECT name FROM B ORDER BY name DESC;
结果:
name ----- Charlie Bob Alice
- 如果需要对合并后的结果集排序,只能在最后一个
-
NULL 值处理:
- 如果某列包含
NULL
值,UNION
会将其视为相同的值并去重。
示例:
SELECT name FROM A UNION SELECT NULL FROM B;
结果:
name ----- Alice Bob NULL
- 如果某列包含
UNION 和 UNION ALL 的区别
特性 | UNION | UNION ALL |
---|---|---|
去重 | 自动去重 | 不去重 |
性能 | 较慢(需要去重) | 较快(不需要去重) |
结果集大小 | 可能小于输入结果集的总和 | 等于输入结果集的总和 |
总结
- 使用
UNION
时,确保每个SELECT
语句的列数和数据类型一致。 - 如果需要去重,使用
UNION
;如果不需要去重,使用UNION ALL
以提高性能。 - 排序只能在最后一个
SELECT
语句后使用ORDER BY
。