
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

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