摘要:本教程演示如何使用 SQL UNION 合并来自多个查询的两个或多个结果集,并解释 UNION 和 UNION ALL 之间的区别。
SQL UNION 运算符简介
UNION 运算符将两个或多个 SELECT 语句的结果集合并为单个结果集。以下语句说明了如何使用 UNION 运算符合并两个查询的结果集
SELECT
column1, column2
FROM
table1
UNION [ALL]
SELECT
column3, column4
FROM
table2;
Code language: SQL (Structured Query Language) (sql)
要使用 UNION 运算符,你可以编写 SELECT 语句,并用 UNION 关键字连接它们。
SELECT 语句返回的列必须具有相同或可转换的数据类型、大小并且顺序相同。
数据库系统首先通过执行两个 SELECT 语句来处理查询。然后,将两个单独的结果集合并为一个,并消除重复行。为了消除重复行,数据库系统按每一列对合并的结果集进行排序,并扫描它以查找彼此相邻的匹配行。
要保留结果集中的重复行,可以使用 UNION ALL 运算符。
假设我们有两个结果集 A(1,2) 和 B(2,3)。下图说明了 A UNION B

下图说明了 A UNION ALL B

UNION 与 JOIN 的不同之处在于,JOIN 合并多个表的列,而 UNION 合并表的行。
SQL UNION 示例
SQL UNION 示例
要从表 A 中获取数据,可以使用以下 SELECT 语句
SELECT
id
FROM
A;
Code language: SQL (Structured Query Language) (sql)

要从表 B 中检索数据,可以使用以下语句
SELECT
id
FROM
B;
Code language: SQL (Structured Query Language) (sql)

要合并这两条查询的结果集,可以使用 UNION 运算符,如下所示
SELECT
id
FROM
a
UNION
SELECT
id
FROM
b;
Code language: SQL (Structured Query Language) (sql)

结果集仅包含 3 行,因为 UNION 运算符删除了一个重复行。
SQL UNION ALL 示例
要保留重复行,可以使用 UNION ALL 运算符,如下所示

带有 ORDER BY 的 SQL UNION 示例
要对结果集进行排序,可以在所有 SELECT 语句之后放置 ORDER BY 子句,如下所示
SELECT
id
FROM
a
UNION
SELECT
id
FROM
b
ORDER BY id DESC;
Code language: SQL (Structured Query Language) (sql)

数据库系统执行以下步骤
- 首先,单独执行每个 SELECT 语句。
- 其次,合并结果集并删除重复行以创建合并结果集。
- 第三,按照 ORDER BY 子句中指定的列对合并结果集进行排序。
实际上,我们经常使用 UNION 运算符合并来自不同表的数据。请查看以下员工和家属表

以下语句使用 UNION 运算符合并员工和家属的姓氏和名字。
SELECT
first_name,
last_name
FROM
employees
UNION
SELECT
first_name,
last_name
FROM
dependents
ORDER BY
last_name;
Code language: SQL (Structured Query Language) (sql)

在本教程中,你学习了如何使用 UNION 运算符合并来自多个查询的两个或多个结果集。