UNION和UNION ALL之间的区别是什么?
当前回答
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,具体取决于数据的来源。
我会在第一篇文章中评论“表现差得多”的评论,但没有足够的声誉(分数)。
其他回答
UNION和UNION ALL之间的基本区别是联合操作从结果集中消除了重复的行,但联合ALL在合并后返回所有行。
从…起http://zengin.wordpress.com/2007/07/31/union-vs-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。
假设你有两张桌子老师和学生
两者都有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 ALL还可以处理更多的数据类型。例如,当尝试联合空间数据类型时。例如:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
将投掷
数据类型几何图形不能用作UNION、INTERSECT或EXCEPT运算符的操作数,因为它不可比较。
然而,工会都不会。
重要的Oracle和Mysql之间的区别:假设t1和t2之间没有重复的行,但它们各自有重复的行。示例:t1从2017年开始销售,t2从2018年开始销售
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE UNION ALL中,从两个表中获取所有行。MySQL中也会发生同样的情况。
然而:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE中,UNION从两个表中提取所有行,因为t1和t2之间没有重复的值。另一方面,在MySQL中,结果集的行数将更少,因为表t1和表t2中都有重复的行!
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?