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。
5474

被折叠的 条评论
为什么被折叠?



