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)
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。
![在此输入图像描述][1]
![在此输入图像描述][2] 。
![在此输入图片说明][3]
![在此输入图片描述][4] 。
[1]: http://i.stack.imgur.com/huYEL.png [2]: http://i.stack.imgur.com/FEaKe.png [3]: http://i.stack.imgur.com/lLiS1.png [4]: http://i.stack.imgur.com/n5gvq.png
UNION'会删除重复的数据,而
UNION ALL'不会。
为了去除重复的数据,必须对结果集进行排序,这*可能会对UNION的性能产生影响,这取决于被排序的数据量以及各种RDBMS参数的设置(对于OraclePGA_AGGREGATE_TARGET
来说,如果WORKAREA_SIZE_POLICY=AUTO
或者SORT_AREA_SIZE
和SOR_AREA_RETAINED_SIZE
如果WORKAREA_SIZE_POLICY=MANUAL
)。
基本上,如果能在内存中进行排序,速度会更快,但关于数据量的注意事项同样适用。
当然,如果你需要返回的数据没有重复,那么你*必须使用UNION,这取决于你的数据来源。
我本想在第一篇文章中评论一下,以限定"是性能更低的"。 的评论,但是没有足够的信誉(积分)来做。
UNION和UNION ALL的基本区别在于,union操作从结果集中消除了重复的记录,而union all在连接后返回所有记录。
从http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
联合体
"UNION "命令用于从两张表中选择相关信息,与 "JOIN "命令很相似。
但是,当使用UNION
命令时,所有被选择的列必须是相同的数据类型。
使用UNION
命令时,只选择不同的值。
UNION ALL
UNION ALL
命令与UNION
命令相同,只是UNION ALL
选择所有值。
Union
和Union all
之间的区别是Union all
不会消除重复的行,而只是从所有符合你的查询细节的表中提取所有行,并将它们合并到一个表中。
UNION
语句有效地对结果集做了一个SELECT DISTINCT
。
如果你知道从你的联合中返回的所有记录都是唯一的,请使用UNION ALL
来代替,它能提供更快的结果。
用维恩图来理解就好了。
这里是[链接][1]的来源。 有一个很好的描述。
[![此处输入图片描述][2]][2] 。
[1]: https://vladimiroracle.wordpress.com/sql/set-operators-union-union-all-minus-intersect/ [2]: http://i.stack.imgur.com/M0gvT.png
UNION - 结果是不同的记录
<br>。
而
<br>。
UNION ALL - 结果是所有的记录,包括重复的记录。
两者都是阻塞操作符,因此我个人更喜欢使用JOINS,而不是阻塞操作符(UNION, INTERSECT, 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'
[![在此输入图像描述][1]][1]
以下是UNION ALL和UNION操作的结果。
[![在此输入图像描述][2]][2]
** UNION语句实际上是在结果集上进行SELECT DISTINCT。 如果你知道从你的联合中返回的所有记录都是唯一的,请使用UNION ALL,它能提供更快的结果。
使用UNION的结果是在执行计划中进行区分排序操作。 证明这句话的证明如下所示。
[![在此输入图像描述][3]][3] 。
[1]: http://i.stack.imgur.com/kdD4p.jpg [2]: http://i.stack.imgur.com/LpjWD.jpg [3]: http://i.stack.imgur.com/QmQlL.jpg
(摘自Microsoft SQL Server Book Online)
UNION [ALL] >.表示将多个结果集合并并作为单一结果集返回。 指定将多个结果集合并并作为一个结果集返回。
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 = Tables的列数)
。
当你没有任何重复的行时,你可以看到这个副作用。
我补充一个例子。
在UNION中,它与不同的-->.合并,速度较慢,因为需要比较。 较慢,因为它需要比较(在Oracle SQL developer中,选择查询,按F10查看成本分析)。
UNION ALL,它是在没有 distinct -->.的情况下进行合并。 更快。
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;
假设你有两个表教师 & 学生
两者都有4列不同的名称,像这样。
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
[![在此输入图像描述][1]][1]
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
[![在此输入图像描述][2]][2]
**你可以对这两个具有相同列数的表使用UNION或UNION ALL,但它们的名称或数据类型不同。 但它们的名称或数据类型不同。
当你对两个表进行 "UNION "操作时,它忽略了所有重复的条目(一个表的所有列值与另一个表相同)。 就像这样
SELECT * FROM Student
UNION
SELECT * FROM Teacher
结果将是
[![在此输入图像描述][3]][3]
当你对两张表进行 "UNION ALL "操作时,它将返回所有重复的条目(如果两张表中任何一行的列值有差异)。 就像这样
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
产出 [![在此输入图像描述][4]][4]
性能:
很明显,UNION ALL的性能比UNION好,因为他们做了额外的任务来删除重复的值。 你可以在MSSQL按ctrl+L从执行估计时间中查看。
[1]: http://i.stack.imgur.com/8uYB7.png [2]: http://i.stack.imgur.com/lyCoB.png [3]: http://i.stack.imgur.com/FNzdi.png [4]: http://i.stack.imgur.com/DTBLt.png
****"UNION "将两个结构上兼容的表的内容合并为一个合并表。
*"UNION "和 "UNION ALL "之间的区别是 "UNION "将省略重复的记录,而 "UNION ALL "将包括重复的记录。
Union
结果集按升序排序,而UNION ALL
结果集不排序。
UNION
对其结果集执行DISTINCT
,因此它将消除任何重复的记录。
而UNION ALL
不会删除重复的记录,因此它比UNION
快。
注: *UNION ALL
的性能通常会比UNION
好,因为UNION
需要服务器做额外的工作来删除任何重复的记录。
因此,在确定不会有任何重复的情况下,或在有重复不是问题的情况下,出于性能考虑,建议使用 "UNION ALL"。
Sql中联合与联合ALL的区别。
什么是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
[联盟VS联盟全部有实例][1]
[1]: http://www.sqlfeathers.com/2018/05/difference-between-union-vs-union-all.html
重要! Oracle和Mysql之间的区别。 比方说,t1 t2之间没有重复的行,但他们有重复的行个别。 例子:t1有2017年的销售额,t2有2018年的销售额。 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中会有重复的行。