当前位置: 首页 > news >正文

MySQL【表的内外连接】

【MySQL 笔记】表的内外连接(JOIN)详解

MySQL 中多表查询最核心的操作就是JOIN(连接),它决定了如何把两张(或多张)表的数据根据某个条件“拼”在一起。

一、MySQL 支持的 JOIN 类型一览表(2026 年现状)

JOIN 类型写法(常用)保留哪些数据MySQL 原生支持结果行数特征典型业务场景
INNER JOININNER JOIN / JOIN两表都匹配上的行(交集)≤ 最小表行数必须双方都有数据的查询(如订单+用户)
LEFT [OUTER] JOINLEFT JOIN左表全部+ 右表匹配的(右表缺→NULL)= 左表行数查所有学生 + 是否选课(没选的也显示)
RIGHT [OUTER] JOINRIGHT JOIN右表全部+ 左表匹配的(左表缺→NULL)= 右表行数查所有课程 + 选课学生(没人选的也显示)
FULL [OUTER] JOINFULL JOIN / FULL OUTER JOIN两表全部(不匹配处补 NULL)(需模拟)≈ 左表 + 右表 - 交集对比两表差异、合并所有记录
CROSS JOINCROSS JOIN / ,(逗号)笛卡尔积(每行×每行)= 左表行数 × 右表行数生成测试数据、全组合场景
SELF JOIN表自己 JOIN 自己同表不同别名是(语法支持)取决于 ON 条件员工-经理关系、上下级、分类树

二、最核心的四种连接对比(带 Venn 图思维)

想象两张表:学生表(左)选课表(右)

  • INNER JOIN → 两个圆重叠的部分
  • LEFT JOIN → 左圆全部 + 重叠部分
  • RIGHT JOIN → 右圆全部 + 重叠部分
  • FULL JOIN → 两个圆的并集(MySQL 要用 UNION 模拟)

三、经典示例表(建议自己建表跑一遍)

-- 学生表CREATETABLEstudents(idINTPRIMARYKEY,nameVARCHAR(20));INSERTINTOstudentsVALUES(1,'小明'),(2,'小红'),(3,'小刚'),(4,'小李'),(5,'小王');-- 课程表(选课记录)CREATETABLEcourses(sidINT,-- 学生IDcnameVARCHAR(30),scoreTINYINT);INSERTINTOcoursesVALUES(1,'数学',95),(1,'英语',88),(2,'数学',76),(3,'英语',92),(3,'物理',85),(6,'化学',90);-- 注意:sid=6 学生不存在

四、各种 JOIN 实战演示

-- 1. INNER JOIN(最常用,只显示有交集的)SELECTs.name,c.cname,c.scoreFROMstudents sINNERJOINcourses cONs.id=c.sid;-- 结果:小明数学95、小明英语88、小红数学76、小刚英语92、小刚物理85-- (小李、小王、sid=6 的都不出现)-- 2. LEFT JOIN(保留左表全部)SELECTs.name,c.cname,c.scoreFROMstudents sLEFTJOINcourses cONs.id=c.sid;-- 结果:上面5行 + 小李 NULL NULL + 小王 NULL NULL-- 3. RIGHT JOIN(保留右表全部)SELECTs.name,c.cname,c.scoreFROMstudents sRIGHTJOINcourses cONs.id=c.sid;-- 结果:上面5行 + NULL 化学 90 (sid=6 没有对应学生)-- 4. MySQL 模拟 FULL JOIN(最常用写法)(SELECTs.name,c.cname,c.scoreFROMstudents sLEFTJOINcourses cONs.id=c.sid)UNION(SELECTs.name,c.cname,c.scoreFROMstudents sRIGHTJOINcourses cONs.id=c.sidWHEREs.idISNULL);-- 避免重复-- 结果:左表全部 + 右表独有的(sid=6 那行)-- 5. CROSS JOIN(笛卡尔积,慎用!)SELECTs.name,c.cnameFROMstudents sCROSSJOINcourses c;-- 结果:5学生 × 6条选课记录 = 30行(爆炸式增长)-- 6. SELF JOIN 示例(员工找经理)-- 假设 employees 表有 id, name, manager_idSELECTe.nameAS员工,m.nameAS经理FROMemployees eLEFTJOINemployees mONe.manager_id=m.id;

五、高频使用场景总结(面试+实战)

场景推荐 JOIN 类型为什么
订单 + 用户信息(必须有用户)INNER JOIN没用户的订单通常是脏数据
所有商品 + 销量(没卖出的显示0)LEFT JOIN商品表为主,销量表可能缺记录
所有课程 + 报名学生数LEFT JOIN + GROUP BY课程表为主,没人报名的也要显示
找出两表差异记录FULL JOIN(模拟)或 LEFT+RIGHT+UNION常用于数据对账、同步检查
生成测试数据、全组合CROSS JOIN很少用于生产,常见于 mock 数据
上下级、分类父子关系SELF JOIN表自己连自己

六、写 JOIN 的小技巧 & 注意点

  1. 永远写 ON 条件(别用 WHERE 写连接条件,容易逻辑混乱)
  2. 小表驱动大表:把数据量小的表放左边(尤其是 LEFT JOIN)
  3. 索引:JOIN 字段必须有索引(尤其是 WHERE / ON / GROUP BY 涉及的列)
  4. 用别名:表名长时必须起别名(s、c、u、o 常用)
  5. NULL 判断:LEFT/RIGHT 后常用WHERE xx IS NULL找“只有左/右表有的”
  6. FULL JOIN 替代方案:LEFT JOIN + UNION + RIGHT JOIN(WHERE 左表 IS NULL)

下一期预告建议:MySQL 多表 JOIN 性能优化 + EXPLAIN 分析 + 索引使用技巧

有 JOIN 写法特别迷惑的业务场景,欢迎留言,我们一起画图分析~
祝大家 JOIN 写得又快又准!🚀

http://www.jsqmd.com/news/500494/

相关文章:

  • 2026年智能水肥一体机选购指南:五大实力厂商深度解析与采购建议 - 2026年企业推荐榜
  • 联想Tech World 26 重磅邀约!深圳市前海微众银行股份有限公司技代表AI 产业规模化标杆分享商业化洞察 - 博客万
  • [特殊字符] 大厂集体“卷“疯了!OpenClaw引爆AI数字员工革命,你的工作会被取代吗?
  • AI建站工具选型指南:从功能到价格,一张表看懂不同工具的差异
  • 阿里云代理商:百炼5 步实现个性化语音合成,企业级应用落地指南
  • 2026年湖南风管加工厂深度测评:五大实力厂商横向对比与选购指南 - 2026年企业推荐榜
  • vector的push_back和emplace_back核心区别
  • 金诺爱美汇科技美容有限公司知名度高吗,在本地提供哪些受欢迎的美容服务? - myqiye
  • 激光摆动焊接的Abaqus温度场分析:探索多种热源与摆动模式
  • 想一次搞定多本软著?亲测有效的申请攻略来啦!
  • 2026年百联卡如何回收,带你解锁三种有效方法 - 京回收小程序
  • 理解LangChain的结构化输出
  • 探寻山西优质观察井厂,口碑好的制造商排名 - 工业设备
  • Avalonia的生命周期 之二
  • 微搭低代码MBA培训管理系统16——商机管理
  • 英伟达 GTC 2026:黄仁勋为何认为每家公司都需要智能体人工智能战略
  • 上海凯茸包装加码安全新赛道:B1级阻燃瓦楞纸投产,构建全场景防护矩阵 - 博客万
  • OpenClaw 腾讯云服务本地访问配置指南
  • 国内首个,面向中小企业数据资产估值体系:“荟宸信科面向中小企业数据资产估值体系”正式发布(二)
  • 2026年电商仓库用大盘纸十大厂家排名,浩月职业纸业上榜 - 工业品网
  • 2026年铜陵市企业搬迁与家庭搬家服务市场主流服务商综合评估指南 - 2026年企业推荐榜
  • 个性化定制+移动应用,ERP系统新玩法的魅力你知道吗?
  • Avalonia的生命周期 之四
  • C语言教程——运算符
  • 2026年执业药师刷题app深度测评:6款热门工具对比,选对少走3个月弯路 - 孤篇横绝
  • 工程师AI工具使用笔记:高效研发辅助技巧
  • SkyReels-Text:Fine-grained Font-Controllable Text Editing for Poster Design
  • 石蜡切片 VS 冰冻切片:一文读懂两者的核心差异与选择策略
  • AI生成课程论文靠谱吗?实测12款一键生成论文的软件教程,效率翻倍告别熬夜! - 掌桥科研-AI论文写作
  • 2026年执业药师备考刷题APP深度测评:6款主流工具优势解析,帮你选对提分神器 - 孤篇横绝