UNION和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。但它们有不同的名称或数据类型。

当您对两个表应用UNION操作时,它会忽略所有重复的条目(一个表中行的所有列值与另一个表相同)。这样地

SELECT * FROM Student
UNION
SELECT * FROM Teacher

结果将是

当您对两个表应用UNION ALL操作时,它将返回具有重复项的所有条目(如果两个表中一行的任何列值之间存在差异)。这样地

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

输出

性能:

显然,UNIONALL的性能优于UNION,因为它们执行了额外的任务来删除重复的值。您可以通过在MSSQL上按ctrl+L从执行估计时间中检查

其他回答

通过运行如下查询,您可以避免重复,并且运行速度仍然比UNION DISTINCT(实际上与UNION相同)快得多:

SELECT*FROM mytable WHERE a=X UNION ALL SELECT*FROM mytable WHERE b=Y AND a=十、

注意AND a=X部分。这比UNION快得多。

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

为了删除重复项,必须对结果集进行排序,这可能会影响UNION的性能,具体取决于要排序的数据量和各种RDBMS参数的设置(对于具有WORKAREA_SIZE_POLICY=AUTO或SORT_AREA_SIZE_SIZE和SOR_AREA_RETAINED_SIZE的Oracle PGA_AGGREGATE_TARGET,如果WORKARE_ASIZE_PPOLICY=MANUAL)。

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

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

我会在第一篇文章中评论“表现差得多”的评论,但没有足够的声誉(分数)。

在ORACLE:UNION不支持BLOB(或CLOB)列类型,UNION ALL支持。

在这里的讨论中添加我的两分钱:可以将UNION运算符理解为纯的、面向SET的UNION-例如,集合a={2,4,6,8},集合B={1,2,3,4},UNION B={1,2,4,6,8}

在处理集合时,您不希望数字2和4出现两次,因为元素在集合中或不在集合中。

然而,在SQL世界中,您可能希望将两个集合中的所有元素放在一个“包”中{2,4,6,8,1,2,3,4}。为此,T-SQL提供了运算符UNION ALL。

联合,联合UNION命令用于从两个表中选择相关信息,非常类似于JOIN命令。但是,在使用UNION命令时,所有选定的列都需要具有相同的数据类型。使用UNION,仅选择不同的值。

联合所有人UNION ALL命令与UNION命令相同,但UNION ALL选择所有值。

Union和Union all的区别在于Union all不会消除重复的行,相反,它只是从所有符合查询细节的表中提取所有行,并将它们组合到一个表中。

UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道从联合返回的所有记录都是唯一的,请改用union all,这样可以更快地获得结果。