UNION
和UNION ALL
之间的区别是什么?
答案 0 :(得分:1571)
UNION
删除重复记录(结果中的所有列都相同),UNION ALL
没有。
使用UNION
而不是UNION ALL
时会出现性能损失,因为数据库服务器必须执行其他工作才能删除重复的行,但通常您不需要重复项(特别是在开发报告时) )。
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
结果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
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)客户
答案 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
选择所有值。
Union
和Union all
之间的区别在于Union all
不会消除重复的行,而只会从适合查询细节的所有表中提取所有行,并将它们组合到一个表中。
UNION
语句有效地对结果集执行SELECT DISTINCT
。如果您知道所有返回的记录在您的联合中都是唯一的,请使用UNION ALL
代替它,它会提供更快的结果。
答案 8 :(得分:7)
不确定哪个数据库重要
UNION
和UNION 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'
以下是UNION ALL和UNION操作的结果。
UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道所有返回的记录在您的联合中都是唯一的,请改用UNION ALL,它会提供更快的结果。
使用UNION会导致执行计划中的不同排序操作。证明此陈述的证据如下所示:
答案 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)
答案 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
将两个结构兼容的表的内容合并到一个组合表中。
UNION
和UNION 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))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
您可以为具有相同列数的两个表应用UNION或UNION ALL。但它们有不同的名称或数据类型。
当您对2个表应用UNION
操作时,它会忽略所有重复的条目(表中行的所有列值都与另一个表相同)。喜欢这个
SELECT * FROM Student
UNION
SELECT * FROM Teacher
结果将是
当您对2个表应用UNION ALL
操作时,它将返回所有具有重复的条目(如果2个表中行的任何列值之间存在任何差异)。喜欢这个
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
<强>性能:强>
显然 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
答案 19 :(得分:1)
简单来说,UNION和UNION ALL之间的区别在于UNION将省略重复记录,而UNION ALL将包含重复记录。
答案 20 :(得分:0)
如果没有ORDER BY
,UNION 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”不会删除重复的行。