Answers:
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)
UNION和UNION ALL都将两个不同SQL的结果连接在一起。它们处理重复项的方式不同。
UNION对结果集执行DISTINCT,从而消除了任何重复的行。
UNION ALL不会删除重复项,因此比UNION快。
注意:使用此命令时,所有选定的列都必须具有相同的数据类型。
示例:如果我们有两个表,则1)员工和2)客户
UNION
删除重复项,UNION ALL
但不删除。
为了删除重复项,必须对结果集进行排序,这可能会对UNION的性能产生影响,这取决于要排序的数据量以及各种RDBMS参数的设置(对于PGA_AGGREGATE_TARGET
带有WORKAREA_SIZE_POLICY=AUTO
or SORT_AREA_SIZE
和SOR_AREA_RETAINED_SIZE
if的Oracle WORKAREA_SIZE_POLICY=MANUAL
)。
基本上,如果可以在内存中执行排序,则速度会更快,但有关数据量的警告同样适用。
当然,如果需要返回的数据没有重复项,则必须使用UNION,具体取决于数据的来源。
我本来会在第一篇文章中发表评论,以限定“绩效差得多”的评论,但声誉(得分)不足。
UNION和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
- UNION
还会删除子查询返回的重复项,而您的方法则不会。
只是为了在这里的讨论中加上我的两分钱:我们可以将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
。
UNION ALL
T-SQL不“提供”。UNION ALL
是ANSI SQL标准的一部分,并非特定于MS SQL Server。
UNION
该UNION
命令用于从两个表中选择相关信息,非常类似于该JOIN
命令。但是,使用该UNION
命令时,所有选定的列都必须具有相同的数据类型。使用UNION
,仅选择不同的值。
UNION ALL
该UNION ALL
命令与UNION
命令相同,只是UNION ALL
选择所有值。
Union
和之间的区别Union all
是Union all
不会消除重复的行,而是仅从所有符合您查询要求的表中提取所有行并将它们组合到一个表中。
一个UNION
语句有效地做一个SELECT DISTINCT
对结果集。如果您知道所有返回的记录在您的联合中都是唯一的,请UNION ALL
改用它,它会提供更快的结果。
不确定哪个数据库重要
UNION
并UNION ALL
应可在所有SQL Server上使用。
您应该避免不必要UNION
的操作,因为它们会造成巨大的性能泄漏。根据经验,UNION ALL
如果不确定使用哪个。
UNION-产生不同的记录,
而
UNION ALL-产生所有记录,包括重复记录。
两者都是阻塞运算符,因此我个人更喜欢随时使用JOINS而不是阻塞运算符(UNION,INTERSECT,UNION ALL等)。
为了说明为什么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
)。
union
可以结合使用join
s和一些确实令人讨厌的case
s 来 产生a的结果,但是它使查询darn-near无法读取和维护,并且以我的经验,这对于性能也很糟糕。比较:select foo.bar from foo union select fizz.buzz from fizz
反对select case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
联合用于从两个表中选择不同的值,其中联合所有用于从表中选择所有值,包括重复项
(来自Microsoft SQL Server联机丛书)
联盟[全部]
指定将多个结果集合并并作为单个结果集返回。
所有
将所有行合并到结果中。这包括重复项。如果未指定,则删除重复的行。
UNION
如果将重复行发现为like,则会花费很长时间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)
应用于结果。没有任何重复的行时,您会看到这种副作用。
我加一个例子
联盟合并的速度较慢->较慢,因为它需要比较(在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;
UNION
将两个结构兼容表的内容合并到一个组合表中。
UNION
和之间的区别UNION ALL
是UNION will
省略重复记录,而UNION ALL
将包括重复记录。
Union
结果集按升序排序,而UNION ALL
结果集不排序
UNION
DISTINCT
对结果集执行,这样它将消除所有重复的行。而UNION ALL
不会删除重复项,因此它比UNION
。* 更快。
注意: 的性能UNION ALL
通常会比更好UNION
,因为UNION
要求服务器执行删除所有重复项的附加工作。因此,在确定没有重复项或没有重复项的问题的情况下,UNION ALL
出于性能原因,建议使用。
ORDER BY
,否则不能保证排序结果。也许您在考虑一个特定的SQL供应商(即使那样,升序到底是什么...?),但是此问题没有供应商=特定的标记。
假设您有两个表Teacher&Student
两者都有这样的具有不同名称的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。但是它们具有不同的名称或数据类型。
当您UNION
在2个表上应用操作时,它会忽略所有重复的条目(一个表中row的所有column值与另一个表相同)。像这样
SELECT * FROM Student
UNION
SELECT * FROM Teacher
结果将是
当您UNION ALL
在2个表上应用操作时,它将返回所有重复项(如果2个表中某行的任何列值之间存在差异)。像这样
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
性能:
显然,UNION ALL性能比UNION更好,因为它们执行附加任务以删除重复值。您可以在MSSQL中按ctrl + L从“ 执行估计时间”中进行检查
UNION
传达意图(即不重复)的一种情况,因为UNION ALL
不可能绝对地获得任何现实生活中的性能提升。
用简单的话来说,UNION和UNION ALL之间的区别是UNION将省略重复的记录,而UNION ALL将包括重复的记录。
我想补充一件事-
联合:-结果集按升序排序。
全部合并:-结果集未排序。两个查询输出仅被追加。
UNION
会不排序结果按升序排列。您在结果中看到的任何未使用的排序order by
都是纯巧合。DBMS可以自由使用它认为有效的删除重复项的任何策略。这可能是排序,但也可能是哈希算法或完全不同的东西-策略将随行数而变化。一个union
是出现排序与100行可能不100.000行
ORDER BY
子句。
重要!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中将存在重复的行!
另一方面,UNION会删除重复的记录,而UNION ALL不会。但是,需要检查将要处理的大量数据,并且列和数据类型必须相同。
由于union在内部使用“独特”行为来选择行,因此,在时间和性能方面会更加昂贵。喜欢
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行
在优先级角度上,两者具有相同的优先级。
唯一的区别是:
“ UNION”删除重复的行。
“ UNION ALL”不会删除重复的行。