UNION和UNION ALL有什么区别?

UNION和UNION ALL有什么区别?

UNION删除重复的logging(结果中的所有列都是相同的),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) 

UNION和UNION ALL都连接两个不同的SQL的结果。 他们在处理重复的方式上有所不同。

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

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

注意:在使用这个命令的时候,所有select的列需要是相同的数据types。

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

  1. 员工表数据:

在这里输入图像描述

  1. 客户表格数据:

在这里输入图像描述

  1. UNION示例(删除所有重复的logging):

在这里输入图像描述

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

在这里输入图像描述

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

为了删除重复项,必须对结果集进行sorting,这可能会影响UNION的性能,具体取决于要sorting的数据量以及各种RDBMS参数的设置(对于使用WORKAREA_SIZE_POLICY=AUTO Oracle PGA_AGGREGATE_TARGETSORT_AREA_SIZESOR_AREA_RETAINED_SIZE如果WORKAREA_SIZE_POLICY=MANUAL )。

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

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

我会对第一篇文章发表评论,以评估“性能低得多”的评论,但是没有足够的声望(点)来这样做。

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

UNION和UNION ALL之间的基本区别是联合操作消除了结果集中的重复行,但union 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!=X

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

我们可以在这里讨论两个分支:可以把UNION算子理解为一个纯粹的,面向SET的UNION,例如集合A = {2,4,6,8},集合B = {1,2,3, 4},A联盟B = {1,2,3,4,6,8}

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

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

联盟
UNION命令用于从两个表中select相关的信息,就像JOIN命令一样。 但是,使用UNION命令时,所有选定的列都必须具有相同的数据types。 使用UNION ,只会select不同的值。

联盟所有
UNION ALL命令与UNION命令相同,只是UNION ALLselect所有的值。

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

一个UNION语句有效地对结果集做一个SELECT DISTINCT 。 如果您知道所有返回的logging都是唯一的,请使用UNION ALL ,这样可以得到更快的结果。

(从Microsoft SQL Server Book Online)

联盟[ALL]

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

所有

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

UNION将花费太长时间,因为重复的行发现像DISTINCT应用于结果。

 SELECT * FROM Table1 UNION SELECT * FROM Table2 

相当于:

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

DISTINCT应用于结果的副作用是对结果进行sorting操作

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

不知道哪个数据库很重要

UNIONUNION ALL应该在所有SQL Server上工作。

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

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

UNION – 产生不同的logging

UNION ALL – 导致所有logging包括重复logging。

两者都阻止运营商,因此我个人更喜欢使用联合阻塞操作符(联盟,INTERSECT,联盟所有等)随时。

为了说明为什么联盟操作与联盟相比效果不佳所有结帐以下示例。

 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。 如果您知道所有返回的logging都是唯一的,请使用UNION ALL,这样可以得到更快的结果。

在执行计划中使用UNION结果执行不同的sorting操作。 certificate这种说法的certificate如下所示:

在这里输入图像描述

用维恩图解来理解是很好的。

这里是源代码的链接 。 有一个很好的描述。

在这里输入图像描述

还有一件事我想补充 –

联盟 : – 结果集按升序sorting。

联盟全部 : – 结果集不sorting。 两个查询输出只是附加。

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

  • 区别:

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

Union结果集按升序sorting,而UNION ALL结果集不sorting

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

注意 UNION ALL的性能通常会比UNION更好,因为UNION要求服务器执行删除任何重复项的额外工作。 所以,如果确定不会有重复,或重复的地方没有问题,那么build议出于性能原因使用UNION ALL

我添加一个例子,

UNION ,它正在合并不同 – >较慢,因为它需要比较(在Oracle SQL开发者中,select查询,按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; 

UNION删除另一手中的重复loggingUNION ALL不。 但是需要检查将要处理的大量数据,并且列和数据types必须相同。

因为工会在内部使用“不同的”行为来select行,因此在时间和性能方面成本更高。 喜欢

 select project_id from t_project union select project_id from t_project_contact 

这给了我2020年的logging

在另一方面

 select project_id from t_project union all select project_id from t_project_contact 

给我超过17402行

在优先视angular上都具有相同的优先权。

如果没有ORDER BY ,则UNION ALL可能会将行带回,而UNION会让您一直等到查询的最后,然后再一次给您整个结果集。 这可能会在超时情况下发生变化 – UNION ALL保持联系活动,因为它是。

所以,如果你有一个超时问题,而且没有sorting,重复也不是问题, UNION ALL可能相当有帮助。

假设你有两个老师学生

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

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

在这里输入图像描述

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

在这里输入图像描述

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

在两个表上应用UNION操作时,忽略所有重复项(表中的所有行值与另一个表相同)。 喜欢这个

 SELECT * FROM Student UNION SELECT * FROM Teacher 

结果将是

在这里输入图像描述

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

 SELECT * FROM Student UNION ALL SELECT * FROM Teacher 

产量 在这里输入图像描述

性能:

很明显UNION ALL性能比UNION更好,因为他们做了额外的任务来删除重复的值。 您可以通过在MSSQL上ctrl + L来检查执行预计时间

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

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

另一方面,UNION ALL命令从两个表中select所有的值,它显示所有的行。