【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 查询中灵活处理多表数据,提高业务逻辑的实现效率。

相关推荐
python机器学习建模2 分钟前
科研论文必须要了解的25个学术网站
数据库
J.P.August1 小时前
Oracle DataGuard启动与关闭顺序
数据库·oracle
尚雷55801 小时前
Oracle 与 达梦 数据库 对比
数据库·oracle·达梦数据库
小猿姐3 小时前
Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云
数据库·mysql·postgresql·开源
百香果果ccc3 小时前
MySQL中的单行函数和聚合函数
数据库·mysql
摸摸陌陌3 小时前
Redis快速入门
数据库·redis·缓存
Elastic 中国社区官方博客3 小时前
Elasticsearch Serverless 中的数据流自动分片
大数据·数据库·elasticsearch·搜索引擎·serverless·时序数据库
Minyy113 小时前
牛客网刷题SQL--高级查询
数据库·sql
秋意钟3 小时前
MySQL基本架构
数据库·mysql·架构
YueTann3 小时前
Leetcode SQL 刷题与答案-基础篇
sql·算法·leetcode