【Oracle11g SQL详解】UNION、UNION ALL、INTERSECT 和 MINUS 的应用场景

UNION、UNION ALL、INTERSECT 和 MINUS 的应用场景

SQL 中的 集合操作符UNIONUNION ALLINTERSECTMINUS)可以将多个查询的结果集按照集合的数学运算规则进行处理。这些操作符通常用于复杂查询,通过合并、比较、过滤数据集,满足多样化的业务需求。


一、操作符简介与基本规则
操作符 功能 去重 常见用途
UNION 合并两个查询结果 去重后合并两个数据集
UNION ALL 合并两个查询结果(保留重复值) 显示所有结果,包括重复数据
INTERSECT 返回两个查询的交集(公共部分) 找出多个表或结果集的公共数据
MINUS 返回第一个查询与第二个查询的差集 获取存在于一个表而不在另一个表中的数据

基本规则

  1. 列数与数据类型需一致
    所有查询结果必须有相同的列数,且每列数据类型需要匹配。
  2. 结果排序
    如果需要对最终结果排序,只能在最后一个结果集之后使用 ORDER BY

二、UNION 和 UNION ALL
1. UNION

定义
UNION 用于合并两个查询的结果集,并自动去除重复值。

适用场景

  • 合并来自不同数据源的数据,确保结果集中不包含重复记录。
  • 查询唯一值,例如统计用户活动或分析唯一数据集。

示例

查询所有客户和供应商的国家名称(去重):

sql 复制代码
SELECT country FROM customers
UNION
SELECT country FROM suppliers;

结果

返回 customerssuppliers 中的国家列表,不包含重复值。


2. UNION ALL

定义
UNION ALL 用于合并两个查询的结果集,但保留所有重复值。

适用场景

  • 数据分析场景下,需要完整展示所有数据记录,包括重复数据。
  • 不关心去重,或性能优先时使用(UNION ALL 无需去重,性能更高)。

示例

查询所有客户和供应商的国家名称(包括重复):

sql 复制代码
SELECT country FROM customers
UNION ALL
SELECT country FROM suppliers;

结果

返回所有国家名称,包括重复的记录。


三、INTERSECT
1. 定义

INTERSECT 返回两个查询结果的交集,仅包含两者共有的数据。

2. 适用场景
  • 用于查找两个表中同时存在的数据。
  • 比如用户管理中,查询同时属于两个权限组的用户。
3. 示例

查询同时是客户和供应商的国家名称:

sql 复制代码
SELECT country FROM customers
INTERSECT
SELECT country FROM suppliers;

结果

只返回既是客户又是供应商的国家。


四、MINUS
1. 定义

MINUS 返回第一个查询中有但第二个查询中没有的记录。

2. 适用场景
  • 用于查找差异,例如找出某表特有的数据。
  • 常用于异常检测或数据排查。
3. 示例

查询是客户但不是供应商的国家名称:

sql 复制代码
SELECT country FROM customers
MINUS
SELECT country FROM suppliers;

结果

返回只出现在 customers 表而未出现在 suppliers 表中的国家。


五、操作符之间的区别与比较
操作符 主要功能 是否去重 性能 适用场景
UNION 合并去重 较低 查询唯一记录
UNION ALL 合并不去重 较高 查询所有记录
INTERSECT 查询两个数据集的交集 较低 查找公共记录
MINUS 查询第一个数据集的差集 较低 排查特定表的独有记录

六、性能优化建议
  1. 优先使用 UNION ALL

    如果数据去重不是必须的,选择 UNION ALL,其性能优于 UNION,因为去重需要额外的排序或哈希计算。

  2. 减少数据量

    在集合操作前对数据进行筛选,尽量减少传递到操作符的记录数。例如:

    sql 复制代码
    SELECT country 
    FROM customers 
    WHERE region = 'North'
    UNION ALL
    SELECT country 
    FROM suppliers
    WHERE region = 'North';
  3. 索引优化

    为涉及的表创建合适的索引,提高集合操作的执行速度。


七、ORDER BY 与集合操作符

ORDER BY 必须位于所有集合操作之后,用于对最终结果排序。例如:

sql 复制代码
SELECT country FROM customers
UNION
SELECT country FROM suppliers
ORDER BY country ASC;

八、小结
  • UNIONUNION ALL 用于合并数据集,UNION 去重,而 UNION ALL 保留重复。
  • INTERSECT 用于查找数据集的交集(共有部分)。
  • MINUS 用于计算差集,找出特定表中独有的数据。

通过合理运用集合操作符,可以在 SQL 查询中灵活处理多表数据,提高业务逻辑的实现效率。

相关推荐
heartbeat..4 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据6 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦6 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
YMatrix 官方技术社区7 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录8 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong8 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
欧亚学术9 小时前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表
黑白极客10 小时前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎
大厂技术总监下海10 小时前
数据湖加速、实时数仓、统一查询层:Apache Doris 如何成为现代数据架构的“高性能中枢”?
大数据·数据库·算法·apache
LeenixP10 小时前
RK3576-Debian12删除userdata分区
linux·运维·服务器·数据库·debian·开发板