协慌网

登录 贡献 社区

UNION 和 UNION ALL 有什么区别?

UNIONUNION ALL什么区别?

答案

UNION删除重复记录(结果中的所有列都相同), UNION ALL不会。

使用UNION而不是UNION ALL时会出现性能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 更快。

注意:使用此命令时,所有选定列都必须具有相同的数据类型。

示例:如果我们有两个表,1)Employee 和 2)Customer

  1. 员工表数据:

在此输入图像描述

  1. 客户表数据:

在此输入图像描述

  1. UNION 示例(删除所有重复记录):

在此输入图像描述

  1. UNION ALL 示例(它只是连接记录,而不是消除重复,所以它比 UNION 快):

在此输入图像描述

UNION删除重复项,而UNION ALL则不删除重复项。

为了删除重复项,必须对结果集进行排序,这可能会对 UNION 的性能产生影响,具体取决于要排序的数据量以及各种 RDBMS 参数的设置(对于 Oracle PGA_AGGREGATE_TARGET其中WORKAREA_SIZE_POLICY=AUTO或如果WORKAREA_SIZE_POLICY=MANUALSOR_AREA_RETAINED_SIZE SORT_AREA_SIZESOR_AREA_RETAINED_SIZE

基本上,如果它可以在内存中执行,那么排序会更快,但同样适用于数据量的警告。

当然,如果您需要返回没有重复的数据,那么您必须使用 UNION,具体取决于数据的来源。

我会对第一篇文章发表评论,以评定 “性能低得多” 的评论,但没有足够的声誉(积分)这样做。