博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNION和UNION ALL有什么区别?
阅读量:2290 次
发布时间:2019-05-09

本文共 5875 字,大约阅读时间需要 19 分钟。

UNIONUNION ALL什么区别?


#1楼

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

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

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


#2楼

联盟

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

全联盟

UNION ALL命令等于UNION命令,只是UNION ALL选择所有值。

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

UNION语句有效地对结果集执行SELECT DISTINCT 。 如果您知道所有返回的记录在您的联合中都是唯一的,请改用UNION ALL ,这样可以更快地得到结果。


#3楼

UNION和UNION ALL都将两个不同的结果连接在一起。 它们处理重复项的方式不同。

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

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

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

示例:如果我们有两个表,则1)员工和2)客户

  1. 员工表数据:

在此处输入图片说明

  1. 客户表数据:

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明


#4楼

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

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

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


#5楼

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


#6楼

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

由于union在内部使用“独特”行为来选择行,因此,在时间和性能方面会更加昂贵。 喜欢

select project_id from t_projectunionselect project_id from t_project_contact

这给了我2020年的记录

在另一方面

select project_id from t_projectunion allselect project_id from t_project_contact

给我超过17402行

在优先级角度上,两者具有相同的优先级。


#7楼

(来自Microsoft SQL Server联机丛书)

联盟[全部]

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

所有

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

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

SELECT * FROM Table1UNIONSELECT * 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) 。 没有任何重复的行时,您会看到这种副作用。


#8楼

我想补充一件事-

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

全部合并 :-结果集未排序。 两个查询输出仅被追加。


#9楼

如果没有ORDER BY ,则UNION ALL可能会将行带回去,而UNION会让您等到查询的最后,才立即为您提供整个结果集。 这可以在超时情况下有所作为UNION ALL使连接保持原来的状态。

因此,如果您遇到超时问题,并且没有排序,并且重复不是问题,那么UNION ALL可能会很有帮助。


#10楼

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

  • 区别:

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

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

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

注意 UNION ALL的性能通常会比UNION ,因为UNION要求服务器执行删除所有重复项的附加工作。 因此,在确定没有任何重复项或没有重复项的问题的情况下,出于性能原因,建议使用UNION ALL


#11楼

理解维恩图非常好。

这是到源的 。 有一个很好的描述。


#12楼

假设您有两个表TeacherStudent

两者都有这样的具有不同名称的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。 但是它们具有不同的名称或数据类型。

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

SELECT * FROM StudentUNIONSELECT * FROM Teacher

结果将是

在2个表上应用UNION ALL操作时,它将返回所有重复项(如果2个表中某行的任何列值之间存在差异)。 像这样

SELECT * FROM StudentUNION ALLSELECT * FROM Teacher

输出量

性能:

显然, UNION ALL性能优于UNION,因为它们执行其他任务来删除重复值。 您可以通过在MSSQL中ctrl + L从“ 执行估计时间”中进行检查


#13楼

UNION-产生不同的记录

UNION ALL-产生所有记录,包括重复记录。

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

为了说明为什么Union操作与Union All相比效果较差,请参见以下示例。

CREATE TABLE #T1 (data VARCHAR(10))INSERT INTO #T1SELECT 'abc'UNION ALLSELECT 'bcd'UNION ALLSELECT 'cde'UNION ALLSELECT 'def'UNION ALLSELECT 'efg'CREATE TABLE #T2 (data VARCHAR(10))INSERT INTO #T2SELECT 'abc'UNION ALLSELECT 'cde'UNION ALLSELECT 'efg'

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

UNION语句有效地对结果集执行SELECT DISTINCT。 如果您知道所有返回的记录在您的联合中都是唯一的,请改用UNION ALL,这样可以更快地得到结果。

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


#14楼

我加一个例子

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

UNION ALL ,它合并时没有不同->更快。

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

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

#15楼

用简单的话来说,UNION和UNION ALL之间的区别是UNION将省略重复的记录,而UNION ALL将包括重复的记录。


#16楼

UNION和UNION ALL之间的基本区别是联合操作从结果集中消除了重复的行,但联合全部在连接后返回了所有行。

来自


#17楼

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)

#18楼

不确定哪个数据库重要

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

您应该避免不必要的UNION因为它们会造成巨大的性能泄漏。 根据经验,如果不确定使用哪个,请使用UNION ALL


#19楼

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


#20楼

SQL中Union vs Union ALL之间的区别

什么是SQL中的联合?

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

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


#21楼

重要! Oracle和Mysql之间的区别:假设t1 t2之间没有重复的行,但是它们各自都有重复的行。 示例:t1的销售额自2017年开始,t2的销售额自2018年开始

SELECT T1.YEAR, T1.PRODUCT FROM T1UNION ALLSELECT T2.YEAR, T2.PRODUCT FROM T2

在ORACLE UNION中,ALL从两个表中提取所有行。 在MySQL中也会发生相同的情况。

然而:

SELECT T1.YEAR, T1.PRODUCT FROM T1UNIONSELECT T2.YEAR, T2.PRODUCT FROM T2

ORACLE中 ,UNION从两个表中获取所有行,因为t1和t2之间没有重复的值。 另一方面,在MySQL中 ,结果集将具有较少的行,因为在表t1以及表t2中将存在重复的行!


#22楼

唯一的区别是:

“ UNION”删除重复的行。

“ UNION ALL”不会删除重复的行。


#23楼

作为一种习惯,请始终使用UNION ALL 。 在特殊情况下,当您需要消除可能非常混乱的重复项时,请仅使用UNION,并且可以在此处的其他注释中阅读全部内容。


#24楼

UNION ALL也适用于更多数据类型。 例如,当尝试合并空间数据类型时。 例如:

select a.SHAPE from tableA aunionselect b.SHAPE from tableB b

会抛出

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

但是union all不会。


#25楼

UNION删除重复项,而UNION ALL不会删除重复项。

为了删除重复项,必须对结果集进行排序,这可能会影响UNION的性能,具体取决于要排序的数据量以及各种RDBMS参数的设置(对于具有WORKAREA_SIZE_POLICY=AUTO Oracle PGA_AGGREGATE_TARGET或如果WORKAREA_SIZE_POLICY=MANUALSOR_AREA_RETAINED_SIZE SORT_AREA_SIZESOR_AREA_RETAINED_SIZE

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

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

我本来会在第一篇文章中发表评论,以限定“表现差得多”的评论,但声誉(得分)不足。


#26楼

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

转载地址:http://uddnb.baihongyu.com/

你可能感兴趣的文章
SVN指定端口启动
查看>>
网站访问速度一般检查参数
查看>>
编译安装过程
查看>>
HTTP常见返回码信息
查看>>
WEB集群session处理方案
查看>>
JDK命令行(jps、jstat、jinfo、jmap、jhat、jstack、jstatd、hprof)与JConsole
查看>>
JAVA 对象访问: 句柄和指针
查看>>
秒杀系统优化思路
查看>>
dubbo 报错:java.lang.NoClassDefFoundError: org/I0Itec/zkclient/exception/ZkNoNodeException
查看>>
logback的使用和logback.xml详解
查看>>
Linux 快捷键
查看>>
JPA 联合主键配置
查看>>
ObjectAlreadyExistsException:Unable to store Job : '*', because one already exists with thi s ident
查看>>
mybatis & JPA 实体类型属性转换
查看>>
Git 中的 ~ 和 ^
查看>>
第一篇博客,给大家分享java、架构师、大数据、人工智能的学习路线,希望能够帮助到大家
查看>>
18级大数据专家,跟大家漫谈大数据平台架构,你能学到多少?上篇
查看>>
18级大数据专家,漫谈大数据平台安全风险与建设,值得学(下篇)
查看>>
阿里P8终于整理出:Nginx+jvm+MySQL+Docker+Spring实战技术文档
查看>>
腾讯T4专家精心整理:大数据+机器学习+数据挖掘+算法大集结
查看>>