SQL:UNION 是否与带有 UNION ALL 子查询的 SELECT DISTINCT 相同

VKK*_*VKK 1 sql database

这两条 SQL 语句在所有情况下都相同吗?

SELECT DISTINCT * FROM 
(SELECT * FROM tablename UNION ALL SELECT * FROM tablename2) dummyname
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM tablename UNION SELECT * FROM tablename2
Run Code Online (Sandbox Code Playgroud)

我总觉得 UNION 很奇怪的一点是它会删除所有非不同的行,即使这些非不同的行出现在 UNION 子句的单个部分中。例如,假设表名只有一列:amt INT。假设 amt INT 不是主键并且对其没有任何唯一约束。然后假设我有两行,其中 amt = 20。无论我使用什么 UNION,结果集中只会出现这两行中的一行。

我正在向其他人解释这种行为,然后想出了上面的例子来证明 UNION 的行为......我相信上面的这两个陈述是相同的(总是),但我只是想确保我所说的是正确的。是否存在上述两个 SQL 语句不会生成完全相同的结果集的边缘情况?

Gor*_*off 6

这两个版本是相同的: UNION在功能上等同SELECT DISTINCTUNION ALL.

UNION 删除表中的重复值以及两个表之间共享的值。

我应该注意到,从性能的角度来看,以下通常比 a 更快UNION

select distinct t.col1, t.col2
from t
union
select distinct t1.col1, t.col2
from t1;
Run Code Online (Sandbox Code Playgroud)

这可能是违反直觉的。但是,如果表中有索引(col1, col2),那么它可以用于select distinct,减少 的行数union。一些优化器可能会错过这个简化输入的机会。