在 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-22 22:39
最后编辑:十一张  更新时间:2025-09-24 10:11