首页 >> 鲜活信息 > 宝藏百科 >

SQL 中内连接使用详细说明 inner join 核心用法

2026-11-12 16:48:37 来源:网易 用户: 

SQL 内连接也就是 inner join,是多表查询最基础最常用的连接方式,核心逻辑是只保留两张表或者多张表连接条件匹配成功的数据,匹配不上的行直接舍弃,不会出现在最终结果集里面,很多新手会把内连接和左连接搞混,左连接会保留左表全部数据,内连接只保留两边都能对上的记录,它适合需要同时从多张业务表取关联数据的场景,比如订单表关联用户表,只查询已经有用户信息的订单,或者商品表关联分类表,只查询已经绑定分类的商品,内连接支持两张表连接,也支持三张甚至更多表连续 inner join,写的时候必须写清楚连接条件,也就是 on 后面的匹配字段,最常见的就是主键和外键对应,比如订单表的用户 id 等于用户表的用户 id,如果忘记写 on 条件,就会变成笛卡尔积,所有行互相匹配,产生海量无效数据,这是写内连接最高频错误,不同数据库 mysql sqlserver oracle 对内连接基础语法是统一的,inner 关键字可以省略,只写 join 默认就是内连接,理解内连接的匹配原理,掌握多表连接写法,区分内连接和外连接,同时了解索引优化和字段重名冲突处理,才算真正掌握 SQL 内连接。

内连接基础语法

select 字段列表

from 表 A

inner join 表 B

on 表 A 关联字段 等于 表 B 关联字段

where 额外筛选条件

语法要点

第一 inner 可以省略,from 表 A join 表 B 等价于 inner join

第二 on 专门写表之间的匹配条件,where 写连接完成之后的筛选条件,两者功能不一样,不要混写

第三 多表查询字段重名的时候,必须加上表名或者表别名做区分,比如 a.id b.id,不然数据库会报字段歧义错误

内连接匹配原理

内连接执行的时候,数据库引擎会把表 A 每一行,去表 B 里面寻找满足 on 条件的记录,找到匹配行就合并成一行输出,如果表 A 某一行在表 B 找不到匹配项,这一行直接丢弃,反过来表 B 里面没有被表 A 匹配到的记录,同样不会出现在结果里面,这个就是内连接最核心的特点,双向过滤,只保留交集数据。

多表内连接写法

三张表内连接示例

select 字段

from 订单表 a

inner join 用户表 b on a 用户 id 等于 b 用户 id

inner join 商品表 c on a 商品 id 等于 c 商品 id

多表内连接是依次连接,先完成前两张表匹配,再把匹配结果和第三张表继续做内连接,每增加一张表,就会继续过滤,只要任意一层连接没有匹配,整条记录就会被剔除,所以表数量越多,最终保留的数据就越少。

内连接相关对照表

连接类型是否保留不匹配数据核心特点
内连接 inner join不保留只保留两表匹配成功的交集数据
左外连接 left join保留左表全部左表没有匹配的右表字段填充空值
右外连接 right join保留右表全部右表没有匹配的左表字段填充空值

深度易错点与优化

第一 笛卡尔积错误,没有写 on 连接条件,所有行两两组合,数据量爆炸,正式业务查询一定要写 on

第二 on 和 where 顺序混淆,on 是连接阶段的匹配规则,where 是连接完成之后再过滤,同样条件写在 on 和 where,内连接最终结果一般差别不大,但是和外连接搭配的时候结果差异非常明显

第三 性能问题,如果关联字段没有建立索引,大表内连接会全表扫描,查询速度很慢,优化方案就是给关联主键外键建立索引

第四 别名规范,多表查询推荐给每张表设置简短别名,减少代码长度,也避免字段歧义

第五 一对多匹配放大数据,如果表 B 里面同一个关联值有多条记录,内连接之后结果行数会比原表 A 更多,也就是数据行数膨胀,写统计 count 的时候一定要注意这个现象

综合来看,SQL 内连接 inner join 就是获取多表关联之后的交集数据,基础写法是 join 加 on,支持两张表和多表连续连接,核心是只保留匹配成功记录,写的时候重点防止笛卡尔积,处理重名字段,大表关联记得加索引,业务上只要需要同时取多张表匹配数据,优先选择内连接,如果需要保留单边未匹配记录,就要改用左连接或者右连接。

【常见问题】

问题 1 SQL 内连接里面 join 不加 inner 是不是一样

回答 1 SQL 内连接里面单独写 join,默认等价于 inner join,SQL 内连接基础语法可以省略 inner 关键字,效果和完整 inner join 完全一致。

问题 2 SQL 内连接会不会保留没有匹配上的数据

回答 1 SQL 内连接不会保留没有匹配上的数据,SQL 内连接只输出两表满足 on 条件的交集记录,两边无法匹配的行都会被过滤掉。

问题 3 SQL 内连接关联字段没有索引会怎么样

回答 1 SQL 内连接关联字段没有索引的时候,大表查询容易全表扫描,SQL 内连接查询耗时会明显变长,优化方式就是给内连接关联的外键主键创建索引。

问题 4 SQL 内连接可以连接三张以上的表吗

回答 1 SQL 内连接支持三张甚至更多表连续连接,SQL 内连接多表写法是依次 inner join,每一张新表都需要单独写 on 匹配条件,只要任意一层匹配失败记录就会被剔除。

【免责申明】

本文内容仅作为 SQL 内连接使用详细说明的学习参考,不同数据库对内连接扩展函数和优化器执行计划存在细微差异,正式业务开发请结合对应数据库官方文档,因错误编写 on 条件或者笛卡尔积造成查询性能异常,由使用者自行承担。

 

相关阅读

最新文章