UNION和UNION ALL有什么区别?
UNION和UNION ALL有什么区别?
UNION删除重复的logging(结果中的所有列都是相同的),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和UNION ALL都连接两个不同的SQL的结果。 他们在处理重复的方式上有所不同。
- 
UNION对结果集执行DISTINCT,消除任何重复的行。 
- 
UNION ALL不会删除重复项,因此它比UNION更快。 
注意:在使用这个命令的时候,所有select的列需要是相同的数据types。
示例:如果我们有两个表,1)Employee和2)Customer
- 员工表数据:

- 客户表格数据:

- UNION示例(删除所有重复的logging):

- UNION ALL示例(它只是连接logging,不消除重复,所以它比UNION更快):

  UNION删除重复,而UNION ALL则不。 
 为了删除重复项,必须对结果集进行sorting,这可能会影响UNION的性能,具体取决于要sorting的数据量以及各种RDBMS参数的设置(对于使用WORKAREA_SIZE_POLICY=AUTO Oracle PGA_AGGREGATE_TARGET或SORT_AREA_SIZE和SOR_AREA_RETAINED_SIZE如果WORKAREA_SIZE_POLICY=MANUAL )。 
基本上,如果可以在内存中执行,sorting会更快,但同样适用于数据量的警告。
当然,如果你需要返回没有重复的数据,那么你必须使用UNION,这取决于你的数据的来源。
我会对第一篇文章发表评论,以评估“性能低得多”的评论,但是没有足够的声望(点)来这样做。
在ORACLE中:UNION不支持BLOB(或CLOB)列types,UNION ALL不支持。
UNION和UNION ALL之间的基本区别是联合操作消除了结果集中的重复行,但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算子理解为一个纯粹的,面向SET的UNION,例如集合A = {2,4,6,8},集合B = {1,2,3, 4},A联盟B = {1,2,3,4,6,8} 
当处理集合时,你不希望数字2和4出现两次,因为一个元素是或不在集合中。
 然而,在SQL的世界中,您可能希望将两个集合中的所有元素集中在一个“包”({2,4,6,8,1,2,3,4})中。 为此,T-SQL提供了操作符UNION ALL 。 
  联盟 
  UNION命令用于从两个表中select相关的信息,就像JOIN命令一样。 但是,使用UNION命令时,所有选定的列都必须具有相同的数据types。 使用UNION ,只会select不同的值。 
  联盟所有 
  UNION ALL命令与UNION命令相同,只是UNION ALLselect所有的值。 
  Union和Union all之间的区别在于Union不会消除重复的行,而只是从所有符合查询细节的表中抽取所有行,并将它们组合到一个表中。 
 一个UNION语句有效地对结果集做一个SELECT DISTINCT 。 如果您知道所有返回的logging都是唯一的,请使用UNION ALL ,这样可以得到更快的结果。 
(从Microsoft SQL Server Book Online)
联盟[ALL]
指定将多个结果集组合并作为单个结果集返回。
所有
将所有行合并到结果中。 这包括重复。 如果未指定,重复的行将被删除。
  UNION将花费太长时间,因为重复的行发现像DISTINCT应用于结果。 
 SELECT * FROM Table1 UNION SELECT * FROM Table2 
相当于:
 SELECT DISTINCT * FROM ( SELECT * FROM Table1 UNION ALL SELECT * FROM Table2) DT 
将
DISTINCT应用于结果的副作用是对结果进行sorting操作 。
  UNION ALL结果将以结果的任意顺序显示,但UNION结果将显示为应用于结果的ORDER BY 1, 2, 3, ..., n (n = column number of Tables) 。 当你没有任何重复的行时,你可以看到这个副作用。 
不知道哪个数据库很重要
  UNION和UNION ALL应该在所有SQL Server上工作。 
 你应该避免不必要的UNION他们是巨大的性能泄漏。 根据经验,如果您不确定使用哪个,请使用UNION ALL 。 
union用于从两个表中select不同的值,其中union all用于select所有值,包括表中的重复值
UNION – 产生不同的logging
而
UNION ALL – 导致所有logging包括重复logging。
两者都阻止运营商,因此我个人更喜欢使用联合阻塞操作符(联盟,INTERSECT,联盟所有等)随时。
为了说明为什么联盟操作与联盟相比效果不佳所有结帐以下示例。
 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。 如果您知道所有返回的logging都是唯一的,请使用UNION ALL,这样可以得到更快的结果。
在执行计划中使用UNION结果执行不同的sorting操作。 certificate这种说法的certificate如下所示:
  
 
用维恩图解来理解是很好的。
这里是源代码的链接 。 有一个很好的描述。
  
 
还有一件事我想补充 –
联盟 : – 结果集按升序sorting。
联盟全部 : – 结果集不sorting。 两个查询输出只是附加。
  UNION将两个结构上兼容的表格的内容合并成一个组合表格。 
- 区别:
  UNION和UNION ALL之间的区别在于UNION UNION will省略重复logging,而UNION ALL将包含重复logging。 
  Union结果集按升序sorting,而UNION ALL结果集不sorting 
  UNION对其结果集执行DISTINCT ,因此它将消除任何重复的行。  UNION ALL不会删除重复项,因此它比UNION更快。* 
  注意 : UNION ALL的性能通常会比UNION更好,因为UNION要求服务器执行删除任何重复项的额外工作。  所以,如果确定不会有重复,或重复的地方没有问题,那么build议出于性能原因使用UNION ALL 。 
我添加一个例子,
UNION ,它正在合并不同 – >较慢,因为它需要比较(在Oracle SQL开发者中,select查询,按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删除另一手中的重复loggingUNION ALL不。 但是需要检查将要处理的大量数据,并且列和数据types必须相同。
因为工会在内部使用“不同的”行为来select行,因此在时间和性能方面成本更高。 喜欢
 select project_id from t_project union select project_id from t_project_contact 
这给了我2020年的logging
在另一方面
 select project_id from t_project union all select project_id from t_project_contact 
给我超过17402行
在优先视angular上都具有相同的优先权。
 如果没有ORDER BY ,则UNION ALL可能会将行带回,而UNION会让您一直等到查询的最后,然后再一次给您整个结果集。 这可能会在超时情况下发生变化 – UNION ALL保持联系活动,因为它是。 
 所以,如果你有一个超时问题,而且没有sorting,重复也不是问题, UNION ALL可能相当有帮助。 
假设你有两个老师和学生表
这两个都有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。 但他们有不同的名称或数据types。
 在两个表上应用UNION操作时,忽略所有重复项(表中的所有行值与另一个表相同)。 喜欢这个 
 SELECT * FROM Student UNION SELECT * FROM Teacher 
结果将是
  
 
 当您在2个表上应用UNION ALL操作时,它将返回具有重复的所有条目(如果两个表中某一行的任何列值之间有任何差异)。 喜欢这个 
 SELECT * FROM Student UNION ALL SELECT * FROM Teacher 
  产量  
 
性能:
很明显UNION ALL性能比UNION更好,因为他们做了额外的任务来删除重复的值。 您可以通过在MSSQL上按ctrl + L来检查执行预计时间
UNION和UNION ALL用于组合两个或多个查询结果。
UNION命令从两个表中select不同的和相关的信息,这将消除重复的行。
另一方面,UNION ALL命令从两个表中select所有的值,它显示所有的行。