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


当前回答

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

当使用UNION而不是UNION ALL时,性能会受到影响,因为数据库服务器必须做额外的工作来删除重复的行,但通常您不希望重复的行(尤其是在开发报表时)。

要识别重复项,记录必须是可比较类型以及兼容类型。这取决于SQL系统。例如,系统可以截断所有长文本字段以生成短文本字段进行比较(MS Jet),或者可以拒绝比较二进制字段(ORACLE)

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)

其他回答

假设你有两张桌子老师和学生

两者都有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和UNION ALL之间的基本区别是联合操作从结果集中消除了重复的行,但联合ALL在合并后返回所有行。

从…起http://zengin.wordpress.com/2007/07/31/union-vs-union-all/

通过运行如下查询,您可以避免重复,并且运行速度仍然比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而不是UNION ALL时,性能会受到影响,因为数据库服务器必须做额外的工作来删除重复的行,但通常您不希望重复的行(尤其是在开发报表时)。

要识别重复项,记录必须是可比较类型以及兼容类型。这取决于SQL系统。例如,系统可以截断所有长文本字段以生成短文本字段进行比较(MS Jet),或者可以拒绝比较二进制字段(ORACLE)

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)

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