我并不是在问它们之间的区别,我的问题是什么时候需要使用 "Union All"?
我并不是在问它们之间的区别,我的问题是什么时候需要使用 "Union All"?
当需要多个数据集的行时,应使用 UNION ALL ,否则使用 UNION 时会删除这些行的多个'副本'。此外,由于数据库引擎不需要确定结果集之间的重复项,因此在查询结束时,使用 UNION ALL 也可能更快。
WHERE ForeignKey IN (SELECT Id FROM view1 UNION ALL SELECT Id FROM view2)
时。您不需要两者,但可以容忍两者。 - Mark Sowul示例
SELECT 1 AS foo
UNION
SELECT 1 AS foo
= one row
SELECT 1 AS foo
UNION ALL
SELECT 1 AS foo
= two rows
mysql> select * from tmp1;
+------+
| a |
+------+
| foo1 |
| foo2 |
+------+
2 rows in set (0.00 sec)
mysql> select * from tmp2;
+------+
| a |
+------+
| foo2 |
| foo3 |
| foo4 |
+------+
3 rows in set (0.00 sec)
mysql> select * from tmp1 union select * from tmp2;
+------+
| a |
+------+
| foo1 |
| foo2 | # DUPLICATES REMOVED.
| foo3 |
| foo4 |
+------+
4 rows in set (0.00 sec)
mysql> select * from tmp1 union all select * from tmp2;
+------+
| a |
+------+
| foo1 |
| foo2 |
| foo2 | # DUPLICATES NOT REMOVED.
| foo3 |
| foo4 |
+------+
5 rows in set (0.00 sec)
关于何时使用UNION ALL的问题:
如果您不关心结果集是否有重复行,或者您知道不会有任何重复行,则请使用UNION ALL
而不是UNION
。
UNION
可以确保唯一的行,理论上应该始终使用UNION
。然而,由于UNION ALL
不能确保唯一的行,如果您可以确定两个表已经包含唯一的行,则在实践中可能更喜欢UNION ALL
,因为它可以提高性能。SELECT DISTINCT
和SELECT ALL
之间的选择也适用于相同的逻辑。需要使用它们取决于您的要求。UNION和UNION ALL之间的区别在于,UNION ALL不会删除重复行。
Union all
用于将多个数据集合并为一个数据集,但它不会删除重复项。
当我们不需要从记录集中排除重复行时
当两个结果集具有相同的列(数量和类型)时,您可以使用UNION ALL将它们连接(追加)成一个单独的结果集。
Select name from table
Union all
Select max(name) from table
Vs
Select name from table
Union
Select max(name) from table
默认情况下,UNION将消除重复的值。如果您将UNION替换为UNION ALL,则不再消除重复值。 :)