当前位置:  开发笔记 > 数据库 > 正文

UNION和UNION ALL有什么区别?

如何解决《UNION和UNIONALL有什么区别?》经验,为你挑选了14个好方法。

UNION和之间有什么区别UNION ALL



1> Jim Harte..:

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)


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

2> Bhaumik Pate..:

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

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

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

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

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

    员工表数据:

在此输入图像描述

    客户表数据:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述


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

3> 小智..:

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

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

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

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

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



4> Michiel Over..:

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



5> George Mauer..:

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

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



6> Ihor Vorotno..:

您可以通过运行以下命令来避免重复并且仍然比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"也会删除子查询返回的重复项,而您的方法则不会.

7> Peter Perháč..:

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



8> 小智..:

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

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

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

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



9> Jakub Šturc..:

不确定哪个数据库很重要

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

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



10> 小智..:

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



11> michael-mamm..:

用Venn diagramm很好理解.

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

在此输入图像描述


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

12> 小智..:

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'

在此输入图像描述

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

在此输入图像描述

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

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

在此输入图像描述


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

13> shA.t..:

(来自Microsoft SQL Server联机丛书)

UNION [全部]

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

所有

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

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)应用于结果.当您没有任何重复行时​​,您可以看到此副作用.



14> nhuvy..:

我加一个例子

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;

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有