MySQL 多表连接查询实战:内连接 + 外连接
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 什么是表连接为什么要用连接二. 内连接inner join取两表交集2.1 语法标准写法2.2 PPT 实战案例查询 SMITH 的姓名和部门名称2.3 内连接特点三. 外连接保留某张表的全部数据3.1 左外连接left join保留左表全部数据3.1.1 语法3.1.2 实战案例查询所有学生的成绩含无成绩的学生3.2 右外连接right join保留右表全部数据3.2.1 语法3.2.2 实战案例查询所有成绩含无对应学生的成绩3.2.3 查询结果四. 综合实战列出部门及员工含无员工的部门4.1 方法一左外连接以部门表为左表4.2 方法二右外连接以部门表为右表五. 内外连接核心区别一张表看懂六. 避坑指南和总结开发必备结尾前言在实际业务开发中数据往往分散存储在多张关联表中单表查询远不能满足复杂的统计与展示需求。多表连接查询正是解决跨表数据关联、整合与展示的核心手段也是数据库开发中最常用、最重要的技能之一。本文将围绕MySQL 内连接、左外连接、右外连接的核心语法与使用场景结合经典案例由浅入深精讲帮你快速掌握多表查询的精髓轻松应对日常开发与面试。一. 什么是表连接为什么要用连接在实际开发中数据不可能都放在一张表里而是分散在多张关联表中。举个直观例子学生表stu存储学生 id 和姓名无法直接体现成绩成绩表exam存储学生 id 和分数无法直接关联学生姓名。如果想同时展示 “学生姓名 对应成绩”或 “所有学生的成绩含无成绩的学生”就必须通过表连接将两张表的关联字段如 id绑定实现数据联动查询。表连接的核心价值打破表的孤立性整合多表关联数据满足复杂业务查询需求。二. 内连接inner join取两表交集内连接是最常用的连接方式核心逻辑是只保留两张表中关联条件匹配成功的数据相当于 “取两表的交集”。2.1 语法标准写法select字段名from表1innerjoin表2on连接条件and其他筛选条件;inner join内连接关键字inner可省略直接写joinon指定表之间的关联条件如两表的主键 / 外键关联区别于老式的where筛选on更清晰地分离 “连接条件” 和 “业务筛选条件”。2.2 PPT 实战案例查询 SMITH 的姓名和部门名称已知员工表emp和部门表dept通过deptno字段关联需求查询员工 SMITH 的姓名和所属部门名称。-- 标准内连接写法selectename,dnamefromempinnerjoindeptonemp.deptnodept.deptno-- 连接条件两表部门号一致andenamesmith;-- 业务筛选条件员工姓名为smith-- 等价于老式写法不推荐连接逻辑不清晰selectename,dnamefromemp,deptwhereemp.deptnodept.deptnoandenamesmith;2.3 内连接特点只显示两表中匹配成功的数据匹配失败的记录会被过滤关联条件是核心若缺少on或where筛选会产生笛卡尔积数据量爆炸无意义适用于需要 “仅展示有效关联数据” 的场景如查询有部门的员工、有成绩的学生。三. 外连接保留某张表的全部数据外连接的核心是保留其中一张表的全部数据另一张表匹配不到则显示 null分为左外连接和右外连接适用于 “需完整展示主表数据” 的场景。3.1 左外连接left join保留左表全部数据左外连接规则左表的所有记录都会显示右表仅显示匹配成功的记录匹配失败则字段值为 null。3.1.1 语法select字段名from表1-- 左表需完整保留的表leftjoin表2-- 右表匹配表on连接条件;3.1.2 实战案例查询所有学生的成绩含无成绩的学生先创建测试表并插入数据-- 创建学生表createtablestu(idint,namevarchar(30));-- 插入学生数据insertintostuvalues(1,jack),(2,tom),(3,kity),(4,nono);-- 创建成绩表createtableexam(idint,gradeint);-- 插入成绩数据注意id11无对应学生insertintoexamvalues(1,56),(2,76),(11,8);左外连接查询保留所有学生无成绩显示 nullselect*fromstuleftjoinexamonstu.idexam.id;-- 连接条件学生id与成绩表id一致查询结果idnameidgrade1jack1562tom2763kitynullnull4nononullnull可以看到左表stu的 4 名学生全部显示即使 kity 和 nono 没有成绩右表无匹配数据也保留了他们的个人信息。3.2 右外连接right join保留右表全部数据右外连接规则右表的所有记录都会显示左表仅显示匹配成功的记录匹配失败则字段值为 null。3.2.1 语法select字段名from表1-- 左表匹配表rightjoin表2-- 右表需完整保留的表on连接条件;3.2.2 实战案例查询所有成绩含无对应学生的成绩需求显示所有成绩记录即使该成绩没有对应的学生如 exam 中 id11 的成绩。select*fromsturightjoinexamonstu.idexam.id;-- 连接条件学生id与成绩表id一致3.2.3 查询结果idnameidgrade1jack1562tom276nullnull118可以看到右表exam的 3 条成绩全部显示即使 id11 的成绩没有对应学生左表无匹配数据也保留了该成绩记录。四. 综合实战列出部门及员工含无员工的部门需求查询所有部门名称及对应员工信息即使某个部门没有员工也需要显示该部门名称。已知部门表dept和员工表emp通过deptno字段关联两种实现方式如下4.1 方法一左外连接以部门表为左表selectd.dname,e.*fromdept d-- 左表部门表需完整保留leftjoinemp e-- 右表员工表匹配表ond.deptnoe.deptno;-- 连接条件部门号一致4.2 方法二右外连接以部门表为右表selectd.dname,e.*fromemp e-- 左表员工表匹配表rightjoindept d-- 右表部门表需完整保留ond.deptnoe.deptno;-- 连接条件部门号一致两种方法结果完全一致所有部门都会显示无员工的部门对应的员工字段e.*会显示 null。五. 内外连接核心区别一张表看懂连接类型核心逻辑关键字适用场景内连接只保留两表匹配成功的数据inner join查询有效关联数据如有部门的员工左外连接保留左表全部数据右表匹配不到显示 nullleft join完整展示左表数据如所有学生成绩右外连接保留右表全部数据左表匹配不到显示 nullright join完整展示右表数据如所有成绩记录六. 避坑指南和总结开发必备连接条件不可少忘记on或where筛选会产生笛卡尔积如 stu 表 4 条数据 exam 表 3 条数据 12 条无效数据on与where的区别on用于指定 “表连接条件”where用于筛选 “连接后的结果集”逻辑上先执行on再执行where字段歧义需加别名当两表有同名字段如 id查询时需用表别名.字段名区分如stu.id、exam.id外连接的 “主表” 选择需完整保留数据的表作为左表左连接或右表右连接避免搞反导致数据丢失。总结MySQL 多表连接是日常开发的核心技能核心要点总结内连接inner join取两表交集适用于有效关联数据查询左外连接left join保留左表全部数据适用于完整展示主表 关联数据右外连接right join保留右表全部数据与左连接可灵活转换所有连接查询需明确 “连接条件”避免笛卡尔积字段歧义加别名。结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语掌握这些知识点能轻松应对日常开发中的跨表查询需求也能从容应对面试中的连接查询考点。如果需要进一步学习三表连接、复杂条件筛选等进阶内容欢迎在评论区留言交流创作不易觉得有帮助的话欢迎点赞、收藏、关注三连 后续会持续更新 MySQL 查询优化、事务、索引等进阶内容带你从入门到精通数据库开发。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど