UNION和UNION ALL之间的区别是什么?
当前回答
(来自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=表的列数)应用于结果。当没有任何重复行时,可以看到这种副作用。
其他回答
假设你有两张桌子老师和学生
两者都有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和UNION ALL都连接两个不同SQL的结果。它们处理重复项的方式不同。
UNION对结果集执行DISTINCT,消除所有重复的行。UNION ALL不删除重复项,因此它比UNION更快。
注意:使用此命令时,所有选定的列都需要具有相同的数据类型。
示例:如果我们有两个表,1)员工和2)客户
员工表数据:
客户表数据:
UNION示例(它删除所有重复记录):
UNION ALL示例(它只是连接记录,而不是消除重复,因此比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)
不确定哪个数据库很重要
UNION和UNION ALL应适用于所有SQL Server。
您应该避免不必要的UNION,它们是巨大的性能泄漏。根据经验,如果您不确定要使用哪个,请使用UNION ALL。
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?