UNION和UNION ALL有什么区别?

Bri*_*n G 1350 sql union union-all

UNION和之间有什么区别UNION ALL

Jim*_*rte 1666

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

使用时,有一个性能命中UNION,而不是UNION ALL,因为数据库服务器必须做更多的工作,以去除重复行,但通常你不想重复的(特别是当发展报告).

UNION示例:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Run Code Online (Sandbox Code Playgroud)

结果:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

UNION ALL示例:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Run Code Online (Sandbox Code Playgroud)

结果:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

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

Bha*_*tel 271

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

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

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

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

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

  1. 员工表数据:

在此输入图像描述

  1. 客户表数据:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

  • "所有选定的列都需要具有相同的数据类型" - 实际上,事情并不严格(从关系模型的角度来看,这不是一件好事!).SQL标准说它们各自的*列描述符*必须是相同的,除了名称. (3认同)

小智 47

UNION删除重复项,而UNION ALL不是.

为了删除重复的结果集必须进行排序,并且这可能对UNION的性能的影响,这取决于数据的体积进行排序,以及各种RDBMS参数(对于Oracle的设置PGA_AGGREGATE_TARGETWORKAREA_SIZE_POLICY=AUTOSORT_AREA_SIZESOR_AREA_RETAINED_SIZE如果WORKAREA_SIZE_POLICY=MANUAL).

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

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

我会对第一篇文章发表评论,以评定"性能低得多"的评论,但没有足够的声誉(积分)这样做.

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

Mic*_*eem 30

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


Geo*_*uer 21

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

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


Iho*_*nov 13

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

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

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

  • 这将省略行,因此如果包含NULL值,则无法生成预期结果.此外,它仍然不会返回与"UNION"相同的结果 - "UNION"也会删除子查询返回的重复项,而您的方法则不会. (3认同)

Pet*_*háč 11

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

  • “Nitpick”注释可能意味着您不能在 TSQL 中使用“Union All”,但您可以。当然,评论并没有“这么说”,但阅读它的人可能会推断出这一点。 (3认同)
  • 挑剔:T-SQL 不“提供”“UNION ALL”。`UNION ALL` 是 ANSI SQL 标准的一部分,并不特定于 MS SQL Server。 (2认同)

小智 10

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

UNION ALL
UNION ALL命令等于UNION命令,不同之处在于UNION ALL选择的所有值.

之间的区别UnionUnion allUnion all不会消除重复行,而是刚刚从适合您查询具体的所有表中提取所有行并将它们组合成一个表.

一个UNION语句有效地做一个SELECT DISTINCT对结果集.如果您知道返回的所有记录都是您的联合中唯一的,那么请使用UNION ALL它来提供更快的结果.


Jak*_*urc 8

不确定哪个数据库很重要

UNION并且UNION ALL应该适用于所有SQL Server.

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

  • @oneday当我猜想OP使用短语“SQL Servers”作为所有RDBMS(例如MySQL、PostGreSQL、Oracle、SQL Server)的同义词。不过,这个措辞很不幸(当然,我可能是错的)。 (3认同)
  • @onedaywhen 愿意详细说明吗?至少 https://en.wikipedia.org/wiki/Relational_database_management_system 似乎同意我的观点 - 它明确提到了 Microsoft SQL Server、Oracle 数据库和 MySQL。或者您对 Oracle 和 Oracle 数据库之间的区别很挑剔,例如? (2认同)

小智 6

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


mic*_*mut 6

用Venn diagramm很好理解.

这是源的链接.有一个很好的描述.

在此输入图像描述

  • 你的第二张照片表明,当它们不是时,两者是相互排斥的.图片应该与第一次显示相同,但​​第二次显示"交叉椭圆"`()`.实际上,在第二个想法,因为'union all`结果不是一个集合,你不应该尝试使用维恩图绘制它! (5认同)

小智 6

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'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在此输入图像描述

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

使用UNION会在执行计划中产生不同的排序操作.证明此声明的证据如下所示:

在此输入图像描述

  • 这个答案中的所有内容都已经说过了,太过混乱而无法发挥作用(建议在他们做不同的事情时加入联盟,将"阻塞"作为一个理由而不解释你对它应用的那个或哪个数据库服务器的意思),或者是非常误导的(你的截图中的百分比不适用于`UNION` /`UNION ALL`的实际使用). (3认同)

shA*_*A.t 5

(来自Microsoft SQL Server联机丛书)

UNION [全部]

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

所有

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

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

SELECT * FROM Table1
UNION
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)

相当于:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT
Run Code Online (Sandbox Code Playgroud)

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

UNION ALL结果将显示为结果的任意顺序但UNION结果将显示为ORDER BY 1, 2, 3, ..., n (n = column number of Tables)应用于结果.当您没有任何重复行时​​,您可以看到此副作用.


nhu*_*uvy 5

我加一个例子

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;
Run Code Online (Sandbox Code Playgroud)

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
Run Code Online (Sandbox Code Playgroud)