有什么区别 UNIONUNION ALL?

有帮助吗?

解决方案

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

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

联合示例:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

结果:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

联合所有示例:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

结果:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

其他提示

UNION 和 UNION ALL 都连接两个不同 SQL 的结果。它们的不同之处在于处理重复项的方式。

  • UNION 对结果集执行 DISTINCT,消除任何重复的行。

  • UNION ALL 不会删除重复项,因此它比 UNION 更快。

笔记: 使用此命令时,所有选定的列都必须具有相同的数据类型。

例子:如果我们有两个表,1) Employee 和 2) Customer

  1. 员工表数据:

enter image description here

  1. 客户表数据:

enter image description here

  1. UNION 示例(删除所有重复记录):

enter image description here

  1. UNION ALL 示例(它只是连接记录,不消除重复,因此比 UNION 更快):

enter image description here

UNION 删除重复项,而 UNION ALL 才不是。

为了删除重复项,必须对结果集进行排序,这 可能 对 UNION 的性能有影响,具体取决于要排序的数据量以及各种 RDBMS 参数的设置(对于 Oracle PGA_AGGREGATE_TARGETWORKAREA_SIZE_POLICY=AUTO 或者 SORT_AREA_SIZESOR_AREA_RETAINED_SIZE 如果 WORKAREA_SIZE_POLICY=MANUAL ).

基本上,如果可以在内存中进行排序,排序速度会更快,但同样需要注意数据量。

当然,如果您需要返回不重复的数据,那么您 必须 使用 UNION,具体取决于数据源。

我本来会对第一篇文章发表评论来限定“性能较差”的评论,但没有足够的声誉(积分)来这样做。

在甲骨文中:UNION 不支持 BLOB(或 CLOB)列类型,而 UNION ALL 支持。

UNION 和 UNION ALL 之间的基本区别是 union 操作从结果集中消除了重复的行,但 union 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!=X

注意 AND a!=X 部分。这比 UNION 快得多。

只是为了在这里的讨论中添加我的两分钱:人们可以理解 UNION 运算符作为纯粹的、面向 SET 的 UNION - 例如集合 A={2,4,6,8},集合 B={1,2,3,4},A UNION B = {1,2,3,4,6,8}

处理集合时,您不希望数字 2 和 4 作为元素出现两次 或者 不是 在一组中。

然而,在 SQL 世界中,您可能希望将两个集合中的所有元素放在一个“包”{2,4,6,8,1,2,3,4} 中。为此,T-SQL 提供了运算符 UNION ALL.

联盟
UNION 命令用于从两个表中选择相关信息,很像 JOIN 命令。然而,当使用 UNION 命令所有选定的列必须具有相同的数据类型。和 UNION, ,仅选择不同的值。

联合所有
UNION ALL 命令等于 UNION 命令,除了 UNION ALL 选择所有值。

和...之间的不同 UnionUnion all 就是它 Union all 不会消除重复的行,而是只是从所有适合您的查询细节的表中提取所有行并将它们合并到一个表中。

A UNION 声明有效地做了一个 SELECT DISTINCT 在结果集上。如果您知道返回的所有记录在您的联合中都是唯一的,请使用 UNION ALL 相反,它可以提供更快的结果。

不确定哪个数据库重要

UNIONUNION ALL 应该适用于所有 SQL Server。

你应该避免不必要的 UNION它们是巨大的性能泄漏。根据经验使用 UNION ALL 如果您不确定使用哪个。

union 用于从两个表中选择不同的值 其中 as union all 用于选择所有值,包括 表中的重复项

UNION - 结果 清楚的 记录

尽管

UNION ALL - 结果是所有记录,包括重复项。

两者都是阻塞运算符,因此我个人更喜欢使用 JOINS 而不是阻塞运算符(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'

enter image description here

以下是 UNION ALL 和 UNION 操作的结果。

enter image description here

UNION 语句有效地对结果集执行 SELECT DISTINCT。如果您知道返回的所有记录在联合中都是唯一的,请改用 UNION ALL,它会提供更快的结果。

使用 UNION 结果 不同排序 执行计划中的操作。证明这一说法的证据如下:

enter image description here

(来自 Microsoft SQL Server 在线图书)

联盟[全部]

指定要组合多个结果集并作为单个结果集返回。

全部

将所有行合并到结果中。这包括重复项。如果未指定,则删除重复的行。

UNION 会花费太长的时间,因为重复的行会像这样找到 DISTINCT 应用于结果。

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 = column number of Tables) 应用于结果。当没有任何重复行时​​,您会看到这种副作用。

用维恩图很好理解。

这里是 关联 到源头。有一个很好的描述。

enter image description here

我添加一个例子,

联盟, ,它正在与distinct合并-->较慢,因为它需要比较(在Oracle SQL Developer中,选择查询,按F10查看成本分析)。

联合所有, ,它的合并没有明显的 --> 更快。

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

UNION 将两个结构兼容的表的内容合并到一个组合表中。

  • 不同之处:

和...之间的不同 UNIONUNION ALL 就是它 UNION will 省略重复记录,而 UNION ALL 将包含重复记录。

Union 结果集按升序排序,而 UNION ALL 结果集未排序

UNION 执行一个 DISTINCT 其结果集,因此它将消除任何重复的行。然而 UNION ALL 不会删除重复项,因此它比 UNION.*

笔记: 性能 UNION ALL 通常会比 UNION, , 自从 UNION 要求服务器执行删除任何重复项的额外工作。因此,在确定不会有任何重复项,或者重复项不是问题的情况下,使用 UNION ALL 出于性能原因会推荐。

假设你有两张表 老师 & 学生

都有 4 具有不同名称的列 像这样

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

enter image description here

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

enter image description here

您可以对具有相同列数的两个表应用 UNION 或 UNION ALL。但它们有不同的名称或数据类型。

当您申请时 UNION 对 2 个表进行操作,它忽略所有重复条目(表中行的所有列值与另一个表相同)。像这样

SELECT * FROM Student
UNION
SELECT * FROM Teacher

结果将是

enter image description here

当您申请时 UNION ALL 对 2 个表进行操作,它返回所有重复的条目(如果 2 个表中某行的任何列值之间存在差异)。像这样

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

输出 enter image description here

表现:

明显地 联合所有 性能更好 联盟 因为他们执行额外的任务来删除重复的值。您可以从以下位置检查 执行预计时间 按媒体报道 Ctrl+LSQL数据库

我还想补充一件事——

联盟:- 结果集按升序排序。

联合所有:- 结果集未排序。两个查询输出刚刚被附加。

简而言之,UNION 和 UNION ALL 之间的区别在于 UNION 将省略重复记录,而 UNION ALL 将包含重复记录。

Sql 中 Union 与 Union ALL 的区别

SQL 中什么是 Union?

UNION 运算符用于组合两个或多个数据集的结果集。

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

Union 与 Union All 的比较示例

重要的!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

甲骨文公司, ,UNION 从两个表中获取所有行,因为 t1 和 t2 之间没有重复值。另一方面在 MySQL 结果集的行数将会减少,因为表 t1 和表 t2 中都会有重复的行!

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 行

从优先级的角度来看,两者具有相同的优先级。

如果没有 ORDER BY, , A UNION ALL 可能会随着行的运行而恢复行,而 UNION 会让您等到查询最后才立即提供整个结果集。这可以在超时情况下产生影响 - UNION ALL 可以说保持连接处于活动状态。

因此,如果您遇到超时问题,并且没有排序,并且重复也不是问题, UNION ALL 可能会很有帮助。

UNION 和 UNION ALL 用于组合两个或多个查询结果。

UNION 命令从两个表中选择不同且相关的信息,这将消除重复的行。

另一方面,UNION ALL 命令从两个表中选择所有值,从而显示所有行。

唯一的区别是:

“UNION”删除重复的行。

“UNION ALL”不会删除重复的行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top