SQL Union用法总结

本文介绍SQL中的UNION运算符,包括使用条件、结果集特点及注意事项,并给出具体示例。

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

UNION 运算符将多个 SELECT 语句的结果组合成一个结果集。

(1)使用 UNION 须满足以下条件:

A:所有查询中必须具有相同的结构(即查询中的的列数和列的顺序必须相同)。

B:对应列的数据类型可以不同但是必须兼容(所谓的兼容是指两种类型之间可以进行隐式转换,不能进行隐式转换则报错)。也可以用显式转换为相同的数据类型。

(当数据类型不同时,则根据数据类型优先级规则确定所产生的数据类型。如果类型相同,但精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果)(参照MSDN:数据类型优先级

C:如果为XML数据类型则列必须等价(所有列都必须类型化为 XML 架构,或者为非类型化),如果类型化,这些列必须类型化为相同的 XML 架构集合。

(2)UNION结果集

A:UNION 后的结果集的列名与 第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。

B:UNION默认的删除结果集中重复的记录,如果使用 ALL 关键字则在结果集中保留所有记录(保留重复记录)

(3)注意点

A: Transact-SQL 语句中可以使用多个 UNION 运算符

B:在使用了 UNION 运算符的各个 SELECT 语句不能包含它们自己的 ORDER BY 或 COMPUTE 子句。而只能在最终的组合结果集(即最后一个 SELECT 语句的后面)使用一个 ORDER BY 或 COMPUTE 子句。

C:在使用了 UNION 运算符的各个 SELECT 语句中可以使用 GROUP BY 和 HAVING 子句。

clip_image001

D:默认情况下,SQL Server 2005 从左向右对包含 UNION 运算符的语句求值。可使用圆括号指定求值顺序。

MSDN 例子如下

例如,以下语句并不等价:

/* First statement. */
SELECT * FROM TableA
UNION ALL
( SELECT * FROM TableB
UNION
SELECT * FROM TableC
)
GO
/* Second statement. */
(SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO

在第一个语句中,将消除 TableB 与 TableC 的并集中的重复行。而在该集与 TableA 的并集中,将不消除重复行。在第二个语句中,TableA 与TableB 的并集中将包含重复行,但在随后与 TableC 的并集中将消除重复行。ALL 关键字对此表达式的最终结果没有影响。

(4)例子 参照MSDN

### SQL UNION用法与示例 SQL 中的 `UNION` 操作符用于合并两个或多个 `SELECT` 语句的结果集。它会自动去除重复的行,除非使用 `UNION ALL`,后者会保留所有结果,包括重复行[^1]。 #### 基本语法 ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` - 两个 `SELECT` 语句必须具有相同数量的列。 - 列的数据类型需要兼容。 - 结果集中的列名通常由第一个 `SELECT` 语句决定。 #### 示例 1:基本 UNION 使用 假设有一个 `employees` 表和一个 `managers` 表,可以使用以下查询来合并员工和经理的名字: ```sql SELECT name, 'Employee' AS Type FROM employees WHERE department_id = 5 UNION SELECT name, 'Manager' AS Type FROM managers WHERE department_id = 5; ``` 此查询将返回部门 ID 为 5 的所有员工和经理的名字,并在结果中添加一列表示他们的类型(员工或经理)。 #### 示例 2:UNION ALL 的使用 如果希望保留重复的行,则可以使用 `UNION ALL`: ```sql SELECT device_id, gender, age, gpa FROM user_profile WHERE university = '山东大学' UNION ALL SELECT device_id, gender, age, gpa FROM user_profile WHERE gender = 'male'; ``` 上述查询将返回来自“山东大学”的用户信息以及性别为“male”的用户信息,且不会去重[^4]。 #### 示例 3:结合条件查询 可以通过添加更多条件来细化查询结果。例如: ```sql SELECT product_id, product_name FROM products WHERE category = 'Electronics' UNION SELECT product_id, product_name FROM discontinued_products WHERE category = 'Electronics'; ``` 该查询将返回当前电子产品和已停产电子产品的名称列表[^2]。 #### 注意事项 - 如果需要对最终结果进行排序,可以在最后一个 `SELECT` 语句后添加 `ORDER BY` 子句[^2]。 - `UNION` 和 `UNION ALL` 的性能差异在于是否需要去重。`UNION ALL` 通常比 `UNION` 更快,因为它不需要额外的步骤来删除重复行[^4]。 ### 总结 `UNION` 是一种强大的工具,用于合并不同查询的结果集。通过合理使用 `UNION` 和 `UNION ALL`,可以灵活地处理数据并生成所需的报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值