在 SQL 中,集合运算符用来合并或比较两个或多个查询结果集。这些运算符主要包括 union、union all、intersect和minus(在一些数据库系统中,如 Oracle 中使用 minus,而在其他如 SQL Server 中使用 except)。
下面详细解释这些运算符的用法和区别:

union
union 运算符用于合并两个或多个 select 语句的结果集,并去除重复的记录。这意味着如果两个结果集中有相同的行,这些行在最终的结果集中只会出现一次。
语法:
select column_name(s) from table1
union
select column_name(s) from table2;示例:
select score from persons1
union
select score from persons2;

union all
union all 运算符也用于合并两个或多个 select 语句的结果集,但它不去除重复的记录。这意味着最终结果集中会包含所有来自所有查询的记录,包括重复的。
语法:
select column_name(s) from table1
union all
select column_name(s) from table2;示例:
select score from persons1
union all
select score from persons2;

intersect
intersect 运算符用于返回两个或多个查询结果集的交集,即只返回在所有查询结果中都出现的记录。这在某些数据库系统中可能不被支持(例如,MySQL 和 SQLite 不支持 intersect),在这些系统中,你可以使用 inner join 来实现类似的功能。
语法:
select column_name(s) from table1
intersect
select column_name(s) from table2;示例:
select score from persons1
intersect
select score from persons2;

minus
minus(在某些数据库系统中,如Oracle)或except(如在SQL Server中)运算符用于返回第一个查询结果集中存在、但在第二个查询结果集中不存在的记录。这相当于差集操作。
语法:
select column_name(s) from table1
minus
select column_name(s) from table2;示例:
select score from persons1
minus
select score from persons2;
总结
| 操作符 | 功能描述 | 是否去重 | 性能 | 常见应用场景 |
|---|---|---|---|---|
| union | 合并两个查询结果,去除重复记录 | 是 | 相对较低 | 需要唯一记录,合并不同来源数据 |
| union all | 合并两个查询结果,保留所有记录包括重复的 | 否 | 相对较高 | 需要所有记录,或已知无重复且追求性能 |
| intersect | 返回两个查询结果共有的记录 | 是 | 相对较低 | 查找同时满足多个条件的数据 |
| minus | 返回在第一个查询结果中但不在第二个中的记录 | 是 | 相对较低 | 查找存在于一个表而不在另一个表中的数据(差集) |
注意事项
1、列匹配:在使用union、union all、intersect 和 minus/except 时,参与操作的每个 select 语句中的列数必须相同,并且对应列的数据类型也需要兼容。
2、性能考虑:使用 union all 通常比 union 更高效,因为后者需要额外的步骤来去除重复项。同样,使用具体的数据库功能(如 intersect 和 minus/except )可能需要额外的注意,因为它们可能在不同的数据库系统中表现不同或需要替代方案。
3、替代方案:对于不支持 intersect 和 minus/except 的数据库系统,可以使用其他 SQL 技巧(如使用临时表、子查询或连接条件)来达到类似的效果。例如,使用 inner join 可以达到与 intersect 类似的效果。
了解这些集合运算符的使用和区别可以帮助你更有效地编写 SQL 查询,尤其是在处理复杂的数据集时。
最后编辑:十一张 更新时间:2025-09-24 10:11