UNION 和 UNION ALL 在 SQL Server 中的区别,是你可能在面试中遇到的一个问题。为了演示 UNION 与 UNION ALL 的区别,我们将使用数据库中存在的两张表(Employees 2015 和 Employees 2016)。
从下面的截图可以看出,该表有七行。

这张表有九行。请记住,EmpID 为 6 和 7 的两行在 [Employees2015] 和 [Employees2016] 两张表中都重复出现。

SQL Server中UNION和UNION ALL的区别
这两个运算符都用于将两个或多个 SELECT 语句 的结果集合并成一个单一的结果集。然而,在 SQL Server 中,UNION 和 UNION ALL 的工作功能以及结果集略有不同。
- UNION 会选择所有查询中的所有不重复记录,并删除重复项。此运算符的性能略低于另一个运算符,因为它必须检查重复项(这是一个耗时的过程)。
- UNION ALL 命令将选择所有查询中的所有行(包括重复记录)。
提示:如果你知道表没有重复行,那么请使用 UNION ALL。否则,请使用另一个运算符。
为了向您展示 SQL Server 的 UNION 和 UNION ALL 运算符之间的比较或区别,我们合并了上面表格中相同数量的列。下面的查询将合并 Employees 2015 和 Employees2016 表的结果集,并显示不重复的结果集。
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2015]
UNION
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2016]
从下面的截图可以看出,返回了 14 行。因为除了 2 条记录(EMPID 6 和 7)之外,Employees 2016 中其余的记录都是不重复的。这是因为此运算符只选择不重复的记录并删除重复的行。

下面的查询将返回 Employees 2015 表和 Employees 2016 表中的所有记录(包括重复记录),并显示结果。
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2015]
UNION ALL
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2016]
从下面的图片中可以看到,它返回了 16 条记录。EMPID 6 和 7 都重复了两次(一条记录来自 Employees 2015,另一条来自 Employees 2016)。希望您已经理解了 UNION 和 UNION ALL 之间的区别。
