UNION和UNION ALL有什么区别?

时间:2008-09-08 15:19:33

标签: sql union union-all

UNIONUNION ALL之间的区别是什么?

26 个答案:

答案 0 :(得分:1571)

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)

答案 1 :(得分:259)

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

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

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

  

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

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

  1. 员工表数据:
  2. enter image description here

    1. 客户表格数据:
    2. enter image description here

      1. UNION示例(删除所有重复记录):
      2. enter image description here

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

答案 2 :(得分:44)

UNION删除了重复项,而UNION ALL则没有。

为了删除重复项,必须对结果集进行排序,并且此可能会对UNION的性能产生影响,具体取决于要排序的数据量以及各种RDBMS的设置参数(适用于PGA_AGGREGATE_TARGET的{​​{1}}或WORKAREA_SIZE_POLICY=AUTO的{​​{1}}以及SORT_AREA_SIZE的{​​{1}}。

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

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

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

答案 3 :(得分:28)

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

答案 4 :(得分:21)

  

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

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

答案 5 :(得分:12)

你可以通过运行这样的查询来避免重复并且仍然比UNION DISTINCT(实际上与UNION相同)运行得快得多:

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

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

答案 6 :(得分: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

答案 7 :(得分:10)

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

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

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

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

答案 8 :(得分:7)

  

不确定哪个数据库重要

UNIONUNION ALL应该适用于所有SQL Server。

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

答案 9 :(得分:6)

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

答案 10 :(得分:6)

UNION - 产生不同记录

同时

UNION ALL - 导致所有记录包括重复记录。

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

为了说明为什么联盟操作与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'

enter image description here

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

enter image description here

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

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

enter image description here

答案 11 :(得分:5)

(来自Microsoft SQL Server联机丛书)

UNION [ALL]

  

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

所有

  

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

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)应用于结果。当你没有任何重复的行时,你可以看到这种副作用。

答案 12 :(得分:5)

用Venn diagramm理解是很好的。

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

enter image description here

答案 13 :(得分:5)

我添加了一个例子,

UNION ,它与不同的合并 - &gt;较慢,因为它需要比较(在Oracle SQL开发人员中,选择查询,按F10查看成本分析)。

UNION ALL ,它没有明显合并 - &gt;更快。

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;

答案 14 :(得分:2)

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

  • 差异:

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

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

UNION在其结果集上执行DISTINCT,以便消除任何重复的行。鉴于UNION ALL不会删除重复项,因此速度比UNION快。*

注意 UNION ALL的效果通常会优于UNION,因为UNION需要服务器删除任何重复项的额外工作。因此,如果确定不存在任何重复项,或者重复项不存在问题,建议出于性能原因使用UNION ALL

答案 15 :(得分:2)

假设您有两个表教师&amp; <强>学生

两者都有 4列,名称不同,如此

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

enter image description here

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

enter image description here

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

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

SELECT * FROM Student
UNION
SELECT * FROM Teacher

结果将是

enter image description here

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

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

<强>输出 enter image description here

<强>性能:

显然 UNION ALL 性能优于 UNION ,因为他们执行额外任务来删除重复值。您可以通过 ctrl + L MSSQL

执行预计时间进行检查

答案 16 :(得分:1)

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

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

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

但是:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

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

答案 17 :(得分:1)

我还想补充一点 -

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

全部联盟: - 结果集未排序。只有两个Query输出被追加。

答案 18 :(得分:1)

联盟与联盟ALL之间的差异在Sql中

SQL中的联盟是什么?

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

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

Union Vs Union All With Example

答案 19 :(得分:1)

简单来说,UNION和UNION ALL之间的区别在于UNION将省略重复记录,而UNION ALL将包含重复记录。

答案 20 :(得分:0)

如果没有ORDER BYUNION ALL可能会带回行,而UNION会让你等到查询的最后才给你整个结果立即设置。这可以在超时情况下产生影响 - UNION ALL保持连接活着,就像它一样。

因此,如果您遇到暂停问题,并且没有排序,并且重复项不是问题,那么UNION ALL可能会非常有用。

答案 21 :(得分:0)

UNION删除了另一只手中的重复记录UNION ALL没有。但是需要检查要处理的大量数据,并且列和数据类型必须相同。

因为联盟内部使用&#34; distinct&#34;选择行的行为因此在时间和性能方面成本更高。 像

select project_id from t_project
union
select project_id from t_project_contact  

这给了我2020年的记录

另一方面

select project_id from t_project
union all
select project_id from t_project_contact

给了我超过17402行

优先级透视图上的

都具有相同的优先级。

答案 22 :(得分:0)

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

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

select a.SHAPE from tableA a
union
select 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 :(得分:-2)

唯一的区别是:

“ UNION”删除重复的行。

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