题 UNION和UNION ALL有什么区别?


有什么区别 UNION 和 UNION ALL


1116
2017-09-08 15:19


起源


这个链接可以帮到你 codefari.com/2015/10/what-is-difference-between-union-and.html - Singh


答案:


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)

1373
2017-10-14 16:09



这意味着,联合的性能要低得多,因为它必须扫描重复的结果 - Matthew Watson
UNION ALL确实会更高效,特别是由于缺乏独特的类型。我的一般做法是使用UNION ALL,除非我特别想要重复。 - Adam Caviness
刚刚注意到这里有很多好的评论/答案,所以我打开了wiki标志并添加了关于性能的说明...... - Jim Harte
在实际情况下,UNION ALL可能比UNION慢,因为互联网等网络是瓶颈。传输许多重复行的成本可能超过查询执行时间的好处。这必须根据具体情况进行分析。 - Charles Burns
似乎还会对默认排序顺序产生影响。例如。 'select 9 union select 8 union select 7'以相反的顺序返回结果'select 9 union all select 8 union all select 7'。 - Nine Tails


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

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

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

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

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

  1. 员工表数据:

enter image description here

  1. 客户表数据:

enter image description here

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

enter image description here

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

enter image description here


235
2017-09-18 12:34



“所有选定的列都需要具有相同的数据类型” - 实际上,事情并不严格(从关系模型的角度来看,这不是一件好事!)。 SQL标准说他们各自的 列描述符 除名字外必须相同。 - onedaywhen


UNION 删除重复,而 UNION ALL 才不是。

为了删除重复项,必须对结果集进行排序,并且这样 可能 对UNION的性能产生影响,具体取决于要排序的数据量以及各种RDBMS参数的设置(对于Oracle) PGA_AGGREGATE_TARGET 同 WORKAREA_SIZE_POLICY=AUTO 要么 SORT_AREA_SIZE 和 SOR_AREA_RETAINED_SIZE 如果 WORKAREA_SIZE_POLICY=MANUAL )。

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

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

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


42
2017-09-08 17:10



“为了删除重复项,必须对结果集进行排序” - 也许您有一个特定的供应商,但问题上没有供应商特定的标签。即使有,你能否证明在没有排序的情况下不能删除重复项? - onedaywhen
distinct将“隐式”对结果进行排序,因为在排序集上删除重复项会更快。这并不意味着返回的结果集实际上是以这种方式排序的,但在大多数情况下,distinct(因此,UNION)将在内部对结果集进行排序。 - DevilSuichiro


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


27
2017-09-08 15:20





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

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


18
2017-08-13 00:03





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

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

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


12
2018-06-06 09:55



这将省略行,因此如果包含NULL值,则无法生成预期结果。此外,它仍然不会返回与a相同的结果 UNION  - UNION 还会删除子查询返回的重复项,而您的方法则不会。 - Frank Schmitt
@FrankSchmitt - 谢谢你的回答;关于子查询的这一点正是我想知道的! - Doradus


只是为了在这里讨论加上我的两分钱:人们可以理解 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


12
2017-08-16 16:50



鸡蛋里挑骨头: UNION ALL 不是由T-SQL“提供”。 UNION ALL 是ANSI SQL标准的一部分,并非特定于MS SQL Server。 - Frank Schmitt