SQL Server UNION 操作符将一个或多个 SELECT 语句的结果集合并为单个结果集。UNION 操作符将通过删除重复行来返回所有不同的记录,以下是其基本规则:
- 首先,所有查询中的列数必须相同。
- 列数据类型应相互兼容。
- 最后,所有查询中的列顺序必须相同。
SQL Server UNION 查询语法
UNION 操作符的语法如下所示。
SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table1 UNION SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table2
在此 SQL UNION 查询演示中,我们在数据库中使用两个表(Employees 2015 和 Employees 2016)。

“[Employees 2016]”表的最终结果集包含四条记录。请记住,所有这些记录都是不同的,因为它们在 SELECT 语句中删除了重复的行。

SQL UNION 单列操作
此示例显示了如何使用 SELECT 语句和 UNION 子句合并两个表中的列。以下查询将合并来自 Employees 2015 和 Employees 2016 的 EmpID 的结果集。
SELECT [EmpID] FROM [Employees 2015] UNION SELECT [EmpID] FROM [Employees 2016]

合并两个表示例
在此示例中,我们使用 SELECT 语句合并了这两个表中的“Education”列。
SELECT [Education] FROM [Employees 2015] UNION SELECT [Education] FROM [Employees 2016]

SQL Server UNION 多列示例
在此示例中,我们使用此操作符合并多个列。例如,以下 [Server](https://tutorialgateway.cn/sql/) 查询合并了 Employees 2015 的结果集和 Employees 2016 的结果集,并显示了结果。
SELECT [EmpID], [FirstName], [LastName]
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2015]
UNION
SELECT [EmpID], [FirstName], [LastName]
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2016]

如何将 UNION 与 ORDER BY 子句一起使用?
通常,您可以将其与 ORDER BY 子句一起使用。ORDER BY 子句将根据年收入降序对查询结果进行排序。
SELECT [EmpID], [FirstName], [LastName]
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2015]
UNION
SELECT [EmpID], [FirstName], [LastName]
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2016]
ORDER BY YearlyIncome DESC

SQL Server UNION WHERE 子句示例
如何将其与结构化查询语言的 [WHERE 子句](https://tutorialgateway.cn/sql-where-clause/) 一起使用?在此示例中,我们合并了两个语句。
- 第一个结果集返回 Employees 2015 中年收入大于或等于 70000 的所有行。
- 第二个结果集从 Employees 2016 中 [选择](https://tutorialgateway.cn/sql-select-statement/) 年收入小于 70000 的记录。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2015]
WHERE YearlyIncome >= 70000
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2016]
WHERE YearlyIncome < 70000
ORDER BY YearlyIncome DESC

此 UNION 查询返回 2015 表中职业为“professional”或“management”的所有记录。它返回 2016 表中职业为“Clerical”的记录。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2015]
WHERE Occupation = 'Professional' OR
Occupation = 'Management'
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2016]
WHERE Occupation = 'Clerical'
ORDER BY Occupation DESC

如何将 UNION 操作符与 WHERE 子句一起使用?
您还可以在 WHERE 子句中使用不同的列。在这里,第一个查询返回年收入大于或等于 70000 的记录。第二个查询返回职业为“professional”或“management”的员工。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2015]
WHERE YearlyIncome >= 70000
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation]
,[YearlyIncome], [Sales]
FROM [Employees 2016]
WHERE Occupation = 'Professional' OR
Occupation = 'Management'
ORDER BY Occupation DESC

SQL Server UNION 不同列
它还允许您使用不同表的不同列名。只要它们的数据类型相同,就不会有问题。请记住,结果将采用第一个查询的列名。但是,您可以在两个语句上使用 [别名列](https://tutorialgateway.cn/sql-alias/) 来添加您自己的列名。
以下查询将合并 2015 的“Education”列和 2016 的“Occupation”列的结果。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [YearlyIncome], [Sales]
FROM [Employees 2015]
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Occupation], [YearlyIncome], [Sales]
FROM [Employees 2016]

使用相同的表
您始终可以使用 UNION 操作符对表进行自连接或自合并。在下面的查询中,
- 第一个查询返回所有年收入大于或等于 80000 的员工。
- 第二个查询打印职业为“professional”的员工。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation],
[YearlyIncome], [Sales]
FROM [Employees 2015]
WHERE YearlyIncome >= 80000
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation],
[YearlyIncome], [Sales]
FROM [Employees 2015]
WHERE Occupation = 'Professional'

合并不同数量的列
此示例演示了在此操作符编写过程中遇到的常见错误。接下来,让我们看看当我们在不等长或不同数量的列上执行此 SQL Server UNION 操作时会发生什么。
在这里,我们从 Employees 2016 表中选择“Occupation”作为额外的列。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education],
[YearlyIncome], [Sales]
FROM [Employees 2015]
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education], [Occupation], -- Extra
[YearlyIncome], [Sales]
FROM [Employees 2016]
Messages
--------
Msg 205, Level 16, State 1, Line 2
All queries combined using aUNION, INTERSECT or EXCEPT operator
must have an equal number of expressions in their target lists.
我希望您能阅读并理解其中的信息。现在,让我们修改查询以选择相同数量的列。

从上面的屏幕截图中,它返回了 14 条记录,因为 Employees 2016 中存在重复记录。我们的操作符会删除重复的行,只选择不同的值。
UNION 操作符与 SELECT INTO 语句
您也可以将其包含在 [SELECT INTO 语句](https://tutorialgateway.cn/sql-select-into-statement/) 中。例如,以下查询将结果插入到 Duplicate Emp 表中。
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education],
[YearlyIncome], [Sales]
INTO [SQL Tutorial].[dbo].[DuplicateEmp]
FROM [Employees 2015]
UNION
SELECT [EmpID]
,[FirstName] + ' ' +[LastName] AS Name
,[Education],
[YearlyIncome], [Sales]
FROM [Employees 2016]
WHERE Occupation = 'Professional'
Messages
--------
(14 row(s) affected)
我将向您展示我们插入到 Duplicate Emp 表中的数据。

评论已关闭。