SQL UNION 查询

SQL Server UNION 操作符将一个或多个 SELECT 语句的结果集合并为单个结果集。UNION 操作符将通过删除重复行来返回所有不同的记录,以下是其基本规则:

  1. 首先,所有查询中的列数必须相同。
  2. 列数据类型应相互兼容。
  3. 最后,所有查询中的列顺序必须相同。

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 UNION Query on Two Different Tables 4

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]
Use Multiple Columns 5

如何将 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 Union Order By Clause 6

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 operator Where Clause 7

此 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
Example 8

如何将 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
Union Operator with Where Clause 9

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]
Combine Different Columns Example 10

使用相同的表

您始终可以使用 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'
With Same Table Example 11

合并不同数量的列

此示例演示了在此操作符编写过程中遇到的常见错误。接下来,让我们看看当我们在不等长或不同数量的列上执行此 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.

我希望您能阅读并理解其中的信息。现在,让我们修改查询以选择相同数量的列。

Error Msg 205 : Different Number of Columns

从上面的屏幕截图中,它返回了 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 表中的数据。

Union Select into Statement

评论已关闭。