1、SQL UNION 运算符
UNION
运算符在 SQL 中用于合并两个或多个 SELECT
语句的结果集,并默认去除重复的行。如果你想要包含所有重复行,可以使用 UNION ALL
。下面是一个使用 UNION
运算符的示例,假设我们有两个表:employees_2020
和 employees_2021
,它们存储了不同年份的员工信息,每个表都有 employee_id
(员工ID)和 employee_name
(员工姓名)两个字段。
1.1、示例场景
我们想要查询 2020 年和 2021 年所有员工的姓名,但不希望结果中出现重复的员工姓名。
表结构
employees_2020
employee_id | employee_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
employees_2021
employee_id | employee_name |
---|---|
2 | Bob |
3 | Charlie |
4 | David |
1.2、SQL 查询
sql
SELECT employee_name
FROM employees_2020
UNION
SELECT employee_name
FROM employees_2021;
结果
employee_name |
---|
Alice |
Bob |
Charlie |
David |
解释
这个查询通过 UNION
合并了两个 SELECT
语句的结果集:第一个从 employees_2020
表中选择 employee_name
,第二个从 employees_2021
表中选择 employee_name
。由于 UNION
默认去除重复行,所以尽管 Bob
和 Charlie
在两个表中都出现,但在最终的结果集中只出现一次。
注意
- 如果你的目的是包含所有重复行,应使用
UNION ALL
替代UNION
。 UNION
要求每个SELECT
语句中的列数必须相同,并且对应列的数据类型也需要兼容。- 在使用
UNION
时,默认情况下,SQL 会对结果集进行排序以去除重复项,这可能会影响查询性能。如果不需要排序或去重,使用UNION ALL
可以提高性能。 - 可以在
UNION
或UNION ALL
后添加ORDER BY
语句来对最终结果集进行排序。但请注意,ORDER BY
语句应放在最后一个SELECT
语句之后,并且对所有合并后的列都有效。
UNION
运算符在 SQL 中有广泛的用途,主要用于合并两个或多个SELECT
语句的结果集。以下是一些常见的用途和例子:
1. 3、合并来自不同表的数据
这是 UNION
最直接的用途。当你想要从两个或多个具有相似结构(即列数相同且对应列的数据类型兼容)的表中检索数据时,可以使用 UNION
来合并这些表的结果。
例子 :
假设有两个表,sales_2020
和 sales_2021
,分别记录了 2020 年和 2021 年的销售数据,每个表都有 product_id
和 sales_amount
字段。
sql
SELECT product_id, sales_amount
FROM sales_2020
UNION
SELECT product_id, sales_amount
FROM sales_2021;
这个查询将返回 2020 年和 2021 年所有产品的销售金额,但不包括重复的产品(如果某个产品在两年中都有销售记录,则只会出现一次)。
1.4. 合并具有不同条件的查询结果
有时,你可能想要从同一个表中检索数据,但基于不同的条件。使用 UNION
可以将这些基于不同条件的查询结果合并为一个结果集。
例子 :
假设有一个 employees
表,包含员工的姓名(name
)和部门(department
)信息。你想要检索所有在"销售"部门或"市场"部门的员工姓名。
sql
SELECT name
FROM employees
WHERE department = '销售'
UNION
SELECT name
FROM employees
WHERE department = '市场';
3. 跨数据库合并数据
虽然 UNION
本身是在单个数据库查询中使用的,但你可以通过数据库链接(如 Oracle 的数据库链接或 SQL Server 的链接服务器)来跨数据库合并数据。这通常涉及到更复杂的查询,但基本思想是相同的:从不同的数据源检索数据,并使用 UNION
(或 UNION ALL
)来合并结果。
4. 报告和数据分析
在生成报告或进行数据分析时,经常需要合并来自不同表或不同查询的数据集。UNION
允许你将这些数据集合并为一个,便于进一步的分析或报告生成。
5. 去除重复数据
虽然 UNION
的主要目的不是专门为了去除重复数据(因为那是它的默认行为),但在某些情况下,这正是你想要的。如果你想要从多个表中检索数据,并且只关心唯一的记录,那么 UNION
是一个很好的选择。
注意事项
- 当使用
UNION
时,每个SELECT
语句中的列数必须相同,并且对应列的数据类型也需要兼容。 UNION
默认去除重复的行。如果你想要包含所有重复的行,应该使用UNION ALL
。- 可以在
UNION
或UNION ALL
后面添加ORDER BY
语句来对最终结果集进行排序,但ORDER BY
必须位于最后一个SELECT
语句之后。 - 在某些情况下,使用
JOIN
而不是UNION
可能更合适,特别是当你想要根据两个表之间的关系来合并数据时。然而,JOIN
和UNION
在用途上是不同的,JOIN
用于基于相关列合并行的数据,而UNION
用于合并不同的结果集。