UNION和UNION ALL之间的区别是什么?
当前回答
UNION会删除重复记录,而UNION ALL则不会。但是需要检查要处理的大量数据,并且列和数据类型必须相同。
由于union内部使用“不同”行为来选择行,因此在时间和性能方面成本更高。喜欢
select project_id from t_project
union
select project_id from t_project_contact
这给了我2020年的记录
另一方面
select project_id from t_project
union all
select project_id from t_project_contact
给我超过17402行
从优先级角度看,两者具有相同的优先级。
其他回答
在这里的讨论中添加我的两分钱:可以将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和UNION ALL都连接两个不同SQL的结果。它们处理重复项的方式不同。
UNION对结果集执行DISTINCT,消除所有重复的行。UNION ALL不删除重复项,因此它比UNION更快。
注意:使用此命令时,所有选定的列都需要具有相同的数据类型。
示例:如果我们有两个表,1)员工和2)客户
员工表数据:
客户表数据:
UNION示例(它删除所有重复记录):
UNION ALL示例(它只是连接记录,而不是消除重复,因此比UNION更快):
如果没有ORDERBY,UNION ALL可能会按原样返回行,而UNION则会让您等到查询的最后一刻,然后立即向您提供整个结果集。这在超时情况下会有所不同——UNION ALL会保持连接的活动状态。
因此,如果您有超时问题,并且没有排序,重复也不是问题,UNION ALL可能会非常有用。
UNION-在UNION ALL-生成包括重复项在内的所有记录。
两者都是阻塞运算符,因此我个人更喜欢在任何时候使用JOIN而不是阻塞运算符(UNION、INTERSECT、UNION ALL等)。
为了说明为什么Union操作与Union All相比执行得很差,请执行以下示例。
CREATE TABLE #T1 (data VARCHAR(10))
INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'
CREATE TABLE #T2 (data VARCHAR(10))
INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'
以下是UNION ALL和UNION操作的结果。
UNION语句有效地对结果集执行SELECT DISTINCT。如果您知道从联合返回的所有记录都是唯一的,请改用union all,这样可以更快地获得结果。
使用UNION会导致执行计划中的不同排序操作。证明该声明的证据如下:
UNION ALL还可以处理更多的数据类型。例如,当尝试联合空间数据类型时。例如:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
将投掷
数据类型几何图形不能用作UNION、INTERSECT或EXCEPT运算符的操作数,因为它不可比较。
然而,工会都不会。
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?