UNION和UNION ALL之间的区别是什么?


当前回答

在这里的讨论中添加我的两分钱:可以将UNION运算符理解为纯的、面向SET的UNION-例如,集合a={2,4,6,8},集合B={1,2,3,4},UNION B={1,2,4,6,8}

在处理集合时,您不希望数字2和4出现两次,因为元素在集合中或不在集合中。

然而,在SQL世界中,您可能希望将两个集合中的所有元素放在一个“包”中{2,4,6,8,1,2,3,4}。为此,T-SQL提供了运算符UNION ALL。

其他回答

UNION和UNION ALL之间的基本区别是联合操作从结果集中消除了重复的行,但联合ALL在合并后返回所有行。

从…起http://zengin.wordpress.com/2007/07/31/union-vs-union-all/

通过运行如下查询,您可以避免重复,并且运行速度仍然比UNION DISTINCT(实际上与UNION相同)快得多:

SELECT*FROM mytable WHERE a=X UNION ALL SELECT*FROM mytable WHERE b=Y AND a=十、

注意AND a=X部分。这比UNION快得多。

还有一件事我想补充-

并集:-结果集按升序排序。

全部合并:-结果集未排序。两个查询输出只是附加的。

UNION-在UNION ALL-生成包括重复项在内的所有记录。

两者都是阻塞运算符,因此我个人更喜欢在任何时候使用JOIN而不是阻塞运算符(UNION、INTERSECT、UNION ALL等)。

为了说明为什么Union操作与Union All相比执行得很差,请执行以下示例。

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

以下是UNION ALL和UNION操作的结果。

UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道从联合返回的所有记录都是唯一的,请改用union all,这样可以更快地获得结果。

使用UNION会导致执行计划中的不同排序操作。证明该声明的证据如下:

(来自Microsoft SQL Server联机丛书)

联合[所有]

指定将多个结果集合并并作为单个结果集返回。

ALL

将所有行合并到结果中。这包括重复项。如果未指定,将删除重复的行。

如果对结果应用类似DISTINCT的重复行查找,UNION将花费太长时间。

SELECT * FROM Table1
UNION
SELECT * FROM Table2

相当于:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

对结果应用DISTINCT的副作用是对结果进行排序操作。

UNION ALL结果将显示为结果上的任意顺序,但UNION结果将显示成order BY 1,2,3。。。,n(n=表的列数)应用于结果。当没有任何重复行时,可以看到这种副作用。