SQL大师之路 16 集合操作(Union/Intersect/Except)

在处理数据库查询时,我们经常会遇到需要合并多个查询结果、寻找共同项或排除特定记录的场景。在 SQL 中,每一个 SELECT 语句产生的结果都可以看作是一个记录的集合 ,本文将带你了解集合的三大基础操作:并集 (Union)交集 (Intersect)差集 (Except)


文章目录

  • [一、 并集(UNION)](#一、 并集(UNION))
    • [1.1 UNION 与 UNION ALL](#1.1 UNION 与 UNION ALL)
  • [二、 交集 (INTERSECT)](#二、 交集 (INTERSECT))
  • [三、 差集 (EXCEPT):](#三、 差集 (EXCEPT):)
  • [四、 其他建议](#四、 其他建议)

一、 并集(UNION)

并集操作用于将两个或多个查询的结果组合成一个单一的结果集。

1.1 UNION 与 UNION ALL

合并是最常用的集合操作。

  • UNION :合并结果并自动去重,它会进行一次去重判断,因此会有额外的计算开销。
  • UNION ALL :简单合并所有结果,保留重复项,由于不需要排序去重,性能更高。

案例: 获取所有"高级工程师 (Senior Engineer)"和"经理 (Manager)"的员工编号:

sql 复制代码
SELECT emp_no FROM titles WHERE title = 'Senior Engineer'
UNION
SELECT emp_no FROM dept_manager;

在单表查询中,WHERE title = 'A' OR title = 'B' 的逻辑本质上就是并集。但在跨表(如员工表与经理表)合并数据时,UNION 是不二之选。

注意事项

  • 列数一致 :所有 SELECT 的字段数量必须相同。
  • 类型兼容:对应列的数据类型必须可以相互转换。
  • 排序规则 :如果要排序,ORDER BY 必须放在最后一个查询之后。

二、 交集 (INTERSECT)

交集用于返回同时存在于多个结果集中的记录。

案例: 找出那些既拥有"高级工程师 (Senior Engineer)"头衔,又曾担任过"经理 (Manager)"的骨干员工:

sql 复制代码
SELECT emp_no FROM titles WHERE title = 'Senior Engineer'
INTERSECT
SELECT emp_no FROM dept_manager;

在单表查询中,多个 WHERE 条件的 AND 逻辑等同于交集,跨表查询时需要用INTERSECT。


三、 差集 (EXCEPT):

差集用于从第一个结果集中去掉存在于第二个结果集中的记录。

案例:找出所有从未担任过经理(Manager)的普通高级工程师(Senior Engineer):

sql 复制代码
SELECT emp_no FROM titles WHERE title = 'Senior Engineer'
EXCEPT
SELECT emp_no FROM dept_manager;

四、 其他建议

  1. 优先使用 UNION ALL :除非业务逻辑明确要求结果唯一,否则优先使用 UNION ALL 以规避去重带来的性能损耗。
  2. 字段别名 :最终结果集的列名由第一个 SELECT 语句决定,建议在第一句中明确定义 AS 别名。

相关推荐
数据库小学妹27 分钟前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
龙仔7251 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
神龙天舞20012 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈3 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a3 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事4 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四4 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA5 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜5 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
BEOL贝尔科技5 小时前
样本安全存储中还有哪些重要因素需要考虑?如何设置样本安全?
人工智能·安全·数据分析