您现在的位置是:首页 > 宝藏问答网站首页宝藏问答

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 可能占用大量资源,因语句编写错误或者大表运算造成数据库负载异常,需要自行承担相关风险。

Top