提问



UNIONUNION ALL之间有什么区别?

最佳参考


UNION删除重复记录(结果中的所有列都相同),UNION ALL不会。


使用UNION而不是UNION ALL时会出现性能损失,因为数据库服务器必须执行额外的工作来删除重复的行,但通常您不需要重复项(特别是在开发报表时)。


UNION示例:



SELECT 'foo' AS bar UNION SELECT 'foo' AS bar


结果:


+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)


UNION ALL示例:



SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar


结果:


+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

其它参考1


UNION和UNION ALL都会连接两个不同的SQL的结果。它们处理重复的方式不同。



  • UNION对结果集执行DISTINCT,消除任何重复的行。

  • UNION ALL不会删除重复项,因此比UNION更快。




  注意:使用此命令时,所有选定列都必须属于同一数据类型。



示例:如果我们有两个表,1)Employee和2)Customer



  1. 员工表数据:







  1. 客户表数据:







  1. UNION示例(删除所有重复记录):







  1. UNION ALL示例(它只是连接记录,而不是消除重复,因此它比UNION更快):





其它参考2


UNION删除重复,而UNION ALL则没有。


为了删除重复项,必须对结果集进行排序,并且此可能会影响UNION的性能,具体取决于要排序的数据量以及各种RDBMS参数的设置(对于Oracle PGA_AGGREGATE_TARGET WORKAREA_SIZE_POLICY=AUTOSORT_AREA_SIZESOR_AREA_RETAINED_SIZE if WORKAREA_SIZE_POLICY=MANUAL)。


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


当然,如果您需要返回没有重复的数据,那么必须使用UNION,具体取决于数据的来源。


我会对第一篇文章发表评论,以确定性能低得多的评论,但声誉(点数)不足。

其它参考3


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

其它参考4



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



来自http://zengin.wordpress.com/2007/07/31/union-vs-union-all/[79]

其它参考5


您可以通过运行以下命令来避免重复并且仍然比UNION DISTINCT(实际上与UNION相同)运行得快得多:


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


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

其它参考6


只是为了在这里讨论加上我的两分钱:人们可以将UNION运算符理解为纯粹的,面向SET的UNION - 例如设A={2,4,6,8},设B={1,2,3,4},A UNION B={1,2,3,4,6,8}


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


但是,在SQL世界中,您可能希望在一个包{2,4,6,8,1,2,3,4}中看到两个集合中的所有元素。为此,T-SQL提供了运营商UNION ALL

其它参考7


UNION 结果
UNION命令用于从两个表中选择相关信息,与JOIN命令非常相似。但是,使用UNION命令时,所有选定列都必须具有相同的数据类型。使用UNION时,仅选择不同的值。


UNION ALL

UNION ALL命令等于UNION命令,除了UNION ALL选择所有值。


UnionUnion all之间的区别在于Union all不会消除重复行,而只是从适合查询细节的所有表中提取所有行并将它们组合成一个表。


UNION语句有效地对结果集进行SELECT DISTINCT。如果您知道返回的所有记录都是您的联合中唯一的,请改用UNION ALL,它会提供更快的结果。

其它参考8



  不确定哪个数据库很重要



UNIONUNION ALL应该适用于所有SQL Server。


你应该避免不必要的UNION它们是巨大的性能泄漏。根据经验,如果您不确定使用哪种,请UNION ALL使用。

其它参考9


union用于从两个表中选择不同的值
其中union all用于选择所有值,包括
从表中重复

其它参考10


(来自Microsoft SQL Server联机丛书)


UNION [[ALL]]



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



所有



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



UNION将花费太长时间,因为在结果上应用了类似DISTINCT的重复行。


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 = column number of Tables)应用于结果。当你没有任何重复的行时,你可以看到这种副作用。

其它参考11


UNION - 产生不同记录





UNION ALL - 导致所有记录包括重复记录。


两者都是阻塞运算符,因此我个人更喜欢在阻塞运算符(UNION,INTERSECT,UNION ALL等)上使用JOINS。


为了说明为什么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'


[80]


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


[81]


UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道所有返回的记录在您的联合中是唯一的,请改用UNION ALL,它会提供更快的结果。


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


[82]

其它参考12


用Venn diagramm很好理解。


这是源的链接。有一个很好的描述。[83]


[84]

其它参考13


我添加一个例子,


UNION ,它与明显合并 - >慢,因为它需要比较(在Oracle SQL开发人员中,选择查询,按F10查看成本分析)。


UNION ALL ,它没有明显合并 - >更快。


SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;





SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

其它参考14


还有一件事我想补充一点 -


联盟: - 结果集按升序排序。


全部联盟: - 结果集未排序。只有两个Query输出被追加。

其它参考15


UNION将两个结构兼容的表的内容合并为一个组合表。



  • 差异:



UNIONUNION ALL之间的区别在于UNION will省略了重复记录,而UNION ALL将包含重复记录。


Union结果集按升序排序,而UNION ALL结果集未排序


UNION在其结果集上执行DISTINCT,因此它将消除任何重复的行。而UNION ALL不会删除重复,因此它比UNION更快。*


注意: UNION ALL的效果通常会优于UNION,因为UNION要求服务器执行删除任何重复项的其他工作。因此,如果确定不存在任何重复项,或者重复项不存在问题,建议出于性能原因使用UNION ALL

其它参考16


假设您有两个表教师& 学生


这两个都有 4列,名称不同


Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))


[85]


Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)


[86]


您可以为具有相同列数的两个表应用UNION或UNION ALL。但它们有不同的名称或数据类型。


当您对2个表应用UNION操作时,它忽略所有重复的条目(表中行的所有列值都与另一个表相同)。喜欢这个


SELECT * FROM Student
UNION
SELECT * FROM Teacher


结果将是


[87]


当您对2个表应用UNION ALL操作时,它将返回所有具有重复的条目(如果2个表中的行的任何列值之间存在任何差异)。喜欢这个


SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher


输出
[88]


性能:


显然 UNION ALL 性能优于 UNION ,因为他们执行额外任务来删除重复值。您可以通过 ctrl + L MSSQL 执行预计时间中查看

其它参考17


UNION删除了另一方面的重复记录UNION ALL没有。但是需要检查要处理的大量数据,并且列和数据类型必须相同。


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


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行


在优先级视角上都具有相同的优先级。

其它参考18


如果没有ORDER BYUNION ALL可能会在行走时返回行,而UNION会让你等到查询的最后才给你整个结果集一旦。这可以在超时情况下产生影响 - UNION ALL保持连接活着,就像它一样。


因此,如果你有一个超时问题,并且没有排序,重复不是问题,UNION ALL可能会很有帮助。

其它参考19


UNION和UNION ALL用于组合两个或多个查询结果。


UNION命令从两个表中选择不同的相关信息,这将消除重复的行。


另一方面,UNION ALL命令从两个表中选择所有值,这些值显示所有行。

其它参考20


简单来说,UNION和UNION ALL之间的区别在于UNION将省略重复记录,而UNION ALL将包含重复记录。

其它参考21


联盟与联盟ALL之间的差异在Sql中


什么是SQL中的联盟?


UNION运算符用于组合两个或多个数据集的结果集。


Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order


 Union Vs Union All With Example [89]