SQL 中内连接使用详细说明 inner join 核心用法
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 条件或者笛卡尔积造成查询性能异常,由使用者自行承担。
相关阅读
-
香干回锅肉是在经典回锅肉基础上加入香干的家常改良菜,核心要点是把五花肉先煮至定型再切片,小火煸出多余油...浏览全文>>
-
SQL 内连接也就是 inner join,是多表查询最基础最常用的连接方式,核心逻辑是只保留两张表或者多张表连接...浏览全文>>
-
烧烤锡纸金针菇核心就是提前处理金针菇去除腥味,搭配烧烤调味酱汁,密封锡纸锁住汤汁和香气,烤完鲜嫩入味,...浏览全文>>
-
需要说明,Spotify 并未在中国大陆地区正式上线运营,不建议使用任何违规方式访问境外未合规提供服务的应用,...浏览全文>>
-
全面深化改革是新时代推进国家发展的重大战略部署,核心目的是破除制约经济社会发展的体制机制障碍,解放和发...浏览全文>>
-
spcc 最常见指代是冷轧碳素薄钢板,全称是 cold rolled steel coil,行业内习惯写 spcc,属于日本 JIS...浏览全文>>
-
家常炸薯条想要做到外表酥脆内部绵软,关键是土豆条泡水去淀粉,经过焯水再冷冻的预处理,高温油炸锁住口感,...浏览全文>>
-
核心结论是 soul 的在线状态属于参考性质,并不是百分百精准实时同步,大部分正常使用场景下,显示在线代表...浏览全文>>
-
套内面积 房屋实测可用面积 套内面积简单说就是你自家房门以内,真正归你单独使用的房屋面积,包含套内使用面...浏览全文>>
-
son 的对应词核心是 daughter,son 的中文意思是儿子,属于亲属类名词,对应的反义词也就是性别对应的亲属...浏览全文>>
- 香干回锅肉的家常做法 川味下饭详细教程
- 锡纸金针菇 烧烤版家常做法
- 水煮鸡胸肉怎么去腥味 去腥实操教程
- slowly 怎么解释 副词精讲
- sit 的过去式和过去分词 不规则动词变形详解
- 生活方式包括哪些方面 核心构成
- show 过去式和过去分词形式 不规则动词精讲
- serein 对应的情侣名 配对方案详解
- sd 卡无法读取怎么办 排查修复方案
- sausages 的讲解 单词词性考点深度解析
- rqfii 是指什么 rqfii 制度详细讲解
- 面粉怎么做好吃又简单 家常快手做法
- 没有醒酒器怎么醒红酒 居家替代醒酒方法
- 莱赛尔面料是什么材质 再生纤维素纤维详解
- 苦瓜怎么吃 苦瓜吃法
- QQ 音乐三巨头是谁 网络称号深度解析
- 火鸡的营养价值是什么 营养成分详解
- 红烧鱼块最正宗的做法 入味紧实不易碎
- QQ 号怎样解冻 账号解除冻结操作详解
- 房屋建筑面积怎么计算 规范详细讲解
