您现在的位置是:首页 > 宝藏问答网站首页宝藏问答
intersect 用法 详解 SQL 集合交集运算
- 编辑:武悦彪
- 2026-11-07 23:45:42
- 来源:网易
intersect 是 SQL 标准里面的集合运算符,核心作用是取出多个查询结果集当中共同存在的数据,也就是求两个或者多个 SELECT 查询结果的交集,它会自动去除重复行,只保留两边结果都命中的记录,这个运算符在数据比对核对去重场景使用非常多,很多做数据开发报表核对业务校验的人员经常会用到 intersect,需要注意不同数据库对 intersect 支持情况不一样,MySQL 在 8.0.31 版本之前是不支持 intersect 语法,Oracle SQL Server PostgreSQL 原生支持 intersect,理解 intersect 的时候可以把它理解成数学里面的交集概念,第一个查询拿到一批数据,第二个查询拿到另一批数据,intersect 筛选出两边都有的行,和 union 并集 except 差集属于同一类集合运算家族,使用 intersect 有硬性语法约束,参与运算的所有 SELECT 语句,列的数量必须保持一致,每一列对应的数据类型要兼容,列名称可以不一样但是位置和类型必须匹配,否则数据库会直接报错。
基础语法结构
基础书写格式
SELECT 字段列表 FROM 表 A
INTERSECT
SELECT 字段列表 FROM 表 B
要点说明
1 每一个 SELECT 查询返回的列个数必须相同
2 对应位置字段的数据类型必须兼容
3 默认自动剔除重复记录,不需要额外加 distinct
4 排序 order by 只能写在整个语句最后一段,不能写在单个 SELECT 内部
多表 intersect 连续嵌套写法
intersect 支持连续串联多个查询,代表同时满足所有查询结果集的公共数据
SELECT id,name FROM 表 1
INTERSECT
SELECT id,name FROM 表 2
INTERSECT
SELECT id,name FROM 表 3
含义就是找出同时存在于表 1 表 2 表 3 这三份结果里面的公共行
intersect 和 union except 对比表格
| 运算符 | 作用 | 是否自动去重 |
|---|---|---|
| intersect | 取交集 两边都存在的数据 | 是 |
| union | 取并集 合并全部数据 | 是 |
| union all | 取并集 保留重复行 | 否 |
| except | 取差集 第一个有第二个没有的数据 | 是 |
intersect 常见使用场景
1 数据核对 对比两张表的数据是否一致,比如上线前后新旧表数据校验
2 筛选同时满足多套查询条件的记录,替代复杂 and 嵌套
3 业务匹配 找出同时在两个业务清单里面都存在的客户或者订单
重要限制与踩坑点
1 字段类型兼容不代表完全相同,比如数字类型 int 和 bigint 一般可以兼容,但是字符和数字不能混用
2 不支持在单个 SELECT 里面写 order by,只支持整句末尾排序
3 部分数据库不支持 intersect all,intersect all 不会自动去重,Oracle 支持 intersect all,MySQL 旧版本没有 intersect
4 如果参与查询的列里面包含大字段类型比如 text blob,部分数据库会禁止 intersect 运算
5 性能方面,intersect 底层一般会做排序去重,如果数据量很大,大数据集下性能会下降,大表场景可以改用 inner join 实现等价逻辑
等价改写方案 不支持 intersect 的数据库
MySQL 8.0.31 之前没有 intersect,可以用 inner join 改写实现同样交集效果
SELECT DISTINCT a.id,a.name
FROM 表 A a
INNER JOIN 表 B b
ON a.id = b.id AND a.name = b.name
这个写法和 intersect 效果一致,都会自动剔除重复行
【常见问题】
问题 1 intersect 会保留重复数据吗
回答 1 默认 intersect 会自动去除重复行,如果需要保留重复数据,支持 intersect all 语法的数据库可以使用 intersect all,就不会对交集记录做去重处理。
问题 2 MySQL 为什么执行 intersect 报错
回答 1 早期 MySQL 版本原生不支持 intersect 语法,遇到这种情况不能直接使用 intersect,需要改用 inner join 加 distinct 的等价写法,升级到 MySQL8.0.31 之后才可以正常使用 intersect。
问题 3 intersect 和 inner join 效果完全一样吗
回答 3 在多列匹配场景下,加 distinct 的 inner join 和 intersect 逻辑等价,但是 intersect 是集合运算,是按整行对比,inner join 是按关联条件匹配,当关联条件写漏字段的时候结果就会和 intersect 产生差异。
问题 4 intersect 可以对三个以上查询求交集吗
回答 4 可以,intersect 支持连续串联多个 SELECT 语句,代表同时存在于所有查询结果当中的公共记录,多个 intersect 运算优先级是从左到右依次计算交集。
【免责申明】
本文内容为 SQL 中 intersect 语法的技术讲解,不同数据库版本语法支持存在差异,生产环境执行 intersect 语句前建议先在测试环境验证,大数据表执行 intersect 可能占用大量资源,因语句编写错误或者大表运算造成数据库负载异常,需要自行承担相关风险。