UNION和UNION ALL之间的区别是什么?


当前回答

如果没有ORDERBY,UNION ALL可能会按原样返回行,而UNION则会让您等到查询的最后一刻,然后立即向您提供整个结果集。这在超时情况下会有所不同——UNION ALL会保持连接的活动状态。

因此,如果您有超时问题,并且没有排序,重复也不是问题,UNION ALL可能会非常有用。

其他回答

UNION将两个结构兼容的表的内容合并为一个组合表。

差异:

UNION和UNION ALL的区别在于UNION将省略重复记录,而UNION ALL将包含重复记录。

联合结果集按升序排序,而联合所有结果集不排序

UNION对其结果集执行DISTINCT,以便消除任何重复的行。而UNION ALL不会删除重复项,因此它比UNION更快*

注意:UNION ALL的性能通常会优于UNION,因为UNION需要服务器执行删除任何重复项的额外工作。因此,如果确定不会有任何重复项,或者有重复项不是问题,出于性能原因,建议使用UNION ALL。

我补充一个例子,

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;

and

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

如果没有ORDERBY,UNION ALL可能会按原样返回行,而UNION则会让您等到查询的最后一刻,然后立即向您提供整个结果集。这在超时情况下会有所不同——UNION ALL会保持连接的活动状态。

因此,如果您有超时问题,并且没有排序,重复也不是问题,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从执行估计时间中检查

(来自Microsoft SQL Server联机丛书)

联合[所有]

指定将多个结果集合并并作为单个结果集返回。

ALL

将所有行合并到结果中。这包括重复项。如果未指定,将删除重复的行。

如果对结果应用类似DISTINCT的重复行查找,UNION将花费太长时间。

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=表的列数)应用于结果。当没有任何重复行时,可以看到这种副作用。