UNION
和之间有什么区别UNION ALL
?
UNION
删除重复记录(结果中的所有列都相同),UNION ALL
不会.
使用时,有一个性能命中UNION
,而不是UNION ALL
,因为数据库服务器必须做更多的工作,以去除重复行,但通常你不想重复的(特别是当发展报告).
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更快.
注意:使用此命令时,所有选定列都必须具有相同的数据类型.
示例:如果我们有两个表,1)Employee和2)Customer
员工表数据:
客户表数据:
UNION示例(删除所有重复记录):
UNION ALL示例(它只是连接记录,而不是消除重复,所以它比UNION快):
UNION
删除重复项,而UNION ALL
不是.
为了删除重复的结果集必须进行排序,并且这可能对UNION的性能的影响,这取决于数据的体积进行排序,以及各种RDBMS参数(对于Oracle的设置PGA_AGGREGATE_TARGET
与WORKAREA_SIZE_POLICY=AUTO
或SORT_AREA_SIZE
和SOR_AREA_RETAINED_SIZE
如果WORKAREA_SIZE_POLICY=MANUAL
).
基本上,如果它可以在内存中执行,那么排序会更快,但同样适用于数据量的警告.
当然,如果您需要返回没有重复的数据,那么您必须使用UNION,具体取决于数据的来源.
我会对第一篇文章发表评论,以评定"性能低得多"的评论,但没有足够的声誉(积分)这样做.
在ORACLE中:UNION不支持BLOB(或CLOB)列类型,UNION ALL支持.
UNION和UNION ALL之间的基本区别是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
运算符理解为纯粹的,面向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
该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用于选择所有值,包括表中的重复值
用Venn diagramm很好理解.
这是源的链接.有一个很好的描述.
UNION -导致不同的记录
,而
UNION ALL -结果中的所有记录,包括重复.
两者都是阻塞运算符,因此我个人更喜欢在阻塞运算符(UNION,INTERSECT,UNION ALL等)上使用JOINS.
为了说明为什么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会在执行计划中产生不同的排序操作.证明此声明的证据如下所示:
(来自Microsoft SQL Server联机丛书)
UNION [全部]
指定要组合多个结果集并将其作为单个结果集返回.
所有
将所有行合并到结果中.这包括重复.如果未指定,则删除重复的行.
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)
应用于结果.当您没有任何重复行时,您可以看到此副作用.
我加一个例子
UNION合并的速度明显较慢->,因为它需要比较(在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;