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


当前回答

在ORACLE:UNION不支持BLOB(或CLOB)列类型,UNION ALL支持。

其他回答

还有一件事我想补充-

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

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

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会导致执行计划中的不同排序操作。证明该声明的证据如下:

UNION会删除重复记录,而UNION ALL则不会。但是需要检查要处理的大量数据,并且列和数据类型必须相同。

由于union内部使用“不同”行为来选择行,因此在时间和性能方面成本更高。喜欢

select project_id from t_project
union
select project_id from t_project_contact  

这给了我2020年的记录

另一方面

select project_id from t_project
union all
select project_id from t_project_contact

给我超过17402行

从优先级角度看,两者具有相同的优先级。

UNION删除重复项,而UNION ALL不删除重复项。

为了删除重复项,必须对结果集进行排序,这可能会影响UNION的性能,具体取决于要排序的数据量和各种RDBMS参数的设置(对于具有WORKAREA_SIZE_POLICY=AUTO或SORT_AREA_SIZE_SIZE和SOR_AREA_RETAINED_SIZE的Oracle PGA_AGGREGATE_TARGET,如果WORKARE_ASIZE_PPOLICY=MANUAL)。

基本上,如果排序可以在内存中执行,那么排序速度会更快,但关于数据量的警告同样适用。

当然,如果需要返回没有重复的数据,则必须使用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=表的列数)应用于结果。当没有任何重复行时,可以看到这种副作用。