
【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);-- 注意sid6 学生不存在四、各种 JOIN 实战演示-- 1. INNER JOIN最常用只显示有交集的SELECTs.name,c.cname,c.scoreFROMstudents sINNERJOINcourses cONs.idc.sid;-- 结果小明数学95、小明英语88、小红数学76、小刚英语92、小刚物理85-- 小李、小王、sid6 的都不出现-- 2. LEFT JOIN保留左表全部SELECTs.name,c.cname,c.scoreFROMstudents sLEFTJOINcourses cONs.idc.sid;-- 结果上面5行 小李 NULL NULL 小王 NULL NULL-- 3. RIGHT JOIN保留右表全部SELECTs.name,c.cname,c.scoreFROMstudents sRIGHTJOINcourses cONs.idc.sid;-- 结果上面5行 NULL 化学 90 sid6 没有对应学生-- 4. MySQL 模拟 FULL JOIN最常用写法(SELECTs.name,c.cname,c.scoreFROMstudents sLEFTJOINcourses cONs.idc.sid)UNION(SELECTs.name,c.cname,c.scoreFROMstudents sRIGHTJOINcourses cONs.idc.sidWHEREs.idISNULL);-- 避免重复-- 结果左表全部 右表独有的sid6 那行-- 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_idm.id;五、高频使用场景总结面试实战场景推荐 JOIN 类型为什么订单 用户信息必须有用户INNER JOIN没用户的订单通常是脏数据所有商品 销量没卖出的显示0LEFT JOIN商品表为主销量表可能缺记录所有课程 报名学生数LEFT JOIN GROUP BY课程表为主没人报名的也要显示找出两表差异记录FULL JOIN模拟或 LEFTRIGHTUNION常用于数据对账、同步检查生成测试数据、全组合CROSS JOIN很少用于生产常见于 mock 数据上下级、分类父子关系SELF JOIN表自己连自己六、写 JOIN 的小技巧 注意点永远写 ON 条件别用 WHERE 写连接条件容易逻辑混乱小表驱动大表把数据量小的表放左边尤其是 LEFT JOIN索引JOIN 字段必须有索引尤其是 WHERE / ON / GROUP BY 涉及的列用别名表名长时必须起别名s、c、u、o 常用NULL 判断LEFT/RIGHT 后常用WHERE xx IS NULL找“只有左/右表有的”FULL JOIN 替代方案LEFT JOIN UNION RIGHT JOINWHERE 左表 IS NULL下一期预告建议MySQL 多表 JOIN 性能优化 EXPLAIN 分析 索引使用技巧有 JOIN 写法特别迷惑的业务场景欢迎留言我们一起画图分析祝大家 JOIN 写得又快又准