SQL UNION 和 UNION ALL 操作符

本文详细解释了SQL中的UNION和UNION ALL操作符的用法,包括它们的语法、如何使用以及与不同结果集的交互。通过实际例子展示了如何使用这些操作符来合并来自不同表的记录,特别注意到了UNION不重复记录的特点和UNION ALL的全记录展示特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


SQL UNION 和 UNION ALL 操作符

SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

下面的例子中使用的原始表:

Employees_China:

E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

使用 UNION 命令

实例

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

### SQL 中 `UNION` 与 `UNION ALL` 的区别 SQL 中的 `UNION` `UNION ALL` 都用于将多个 `SELECT` 查询的结果合并为一个结果集,但两者在处理重复数据、性能以及使用场景上存在显著差异。 #### 数据去重行为 - **`UNION`**:会自动去除重复的行,确保最终结果集中不包含重复的数据。这意味着数据库需要对结果集进行额外的排序比较操作来识别并删除重复项。 - **`UNION ALL`**:不会执行任何去重操作,它会将所有查询结果直接合并返回,包括重复的行。因此,它的执行效率通常高于 `UNION`[^1]。 例如,在以下两个临时表中: ```sql 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` 合并这两个表: ```sql SELECT data FROM #T1 UNION SELECT data FROM #T2 ``` 结果将仅包含唯一的值:`abc`, `bcd`, `cde`, `def`, `efg`。 而使用 `UNION ALL`: ```sql SELECT data FROM #T1 UNION ALL SELECT data FROM #T2 ``` 结果将包含所有行,包括重复的 `abc`, `cde`, `efg`。 #### 性能对比 由于 `UNION` 操作会隐式地执行去重逻辑,通常会比 `UNION ALL` 更慢,尤其是在处理大量数据时。去重过程可能涉及排序或哈希操作,这会增加 CPU 内存的开销[^2]。 #### 使用场景 - **`UNION`**:适用于需要合并多个结果集并且要求结果集中无重复记录的场景。例如,合并来自不同部门的员工名单,并确保每个员工只出现一次。 - **`UNION ALL`**:适用于不需要去重的场景,或者可以确保源数据本身没有重复的情况。例如,合并来自不同时间段的日志数据,或者从不同地区获取的唯一标识符集合[^3]。 #### 排序支持 两者都可以配合 `ORDER BY` 子句使用,但需要注意的是,`ORDER BY` 必须放在最后一个 `SELECT` 语句之后,并且只能对最终合并后的结果集进行排序。例如: ```sql SELECT id, name FROM table1 UNION ALL SELECT id, name FROM table2 ORDER BY name; ``` #### 总结 | 特性 | `UNION` | `UNION ALL` | |--------------------|----------------------|-----------------------| | 去重 | 是 | 否 | | 性能 | 较慢(需去重) | 较快(无需去重) | | 适用场景 | 结果集不能有重复 | 允许重复或已知无重复 | 在实际开发中,应根据具体需求选择合适的操作符。如果确定结果集中不会有重复数据,或者不需要去重,则推荐使用 `UNION ALL` 来提升性能[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值