MySQL 多表连接查询实战指南:内连接 + 外连接

 更新时间:2026年04月09日 10:42:43   作者:草莓熊Lotso  
本文详细介绍了MySQL中的内连接、左外连接和右外连接的基本概念、语法和应用场景,通过案例实战展示了如何在实际开发中应用这些连接方式,帮助读者掌握多表查询的核心技能,感兴趣的朋友跟随小编一起看看吧

前言:

在实际业务开发中,数据往往分散存储在多张关联表中,单表查询远不能满足复杂的统计与展示需求。多表连接查询正是解决跨表数据关联、整合与展示的核心手段,也是数据库开发中最常用、最重要的技能之一。本文将围绕 MySQL 内连接、左外连接、右外连接 的核心语法与使用场景,结合经典案例由浅入深精讲,帮你快速掌握多表查询的精髓,轻松应对日常开发与面试。

一. 什么是表连接?为什么要用连接?

在实际开发中,数据不可能都放在一张表里,而是分散在多张关联表中。举个直观例子:

  • 学生表(stu):存储学生 id 和姓名,无法直接体现成绩;
  • 成绩表(exam):存储学生 id 和分数,无法直接关联学生姓名。

如果想同时展示 “学生姓名 + 对应成绩”,或 “所有学生的成绩(含无成绩的学生)”,就必须通过表连接将两张表的关联字段(如 id)绑定,实现数据联动查询。

表连接的核心价值:打破表的孤立性,整合多表关联数据,满足复杂业务查询需求。

二. 内连接(inner join):取两表交集

内连接是最常用的连接方式,核心逻辑是只保留两张表中关联条件匹配成功的数据,相当于 “取两表的交集”。

2.1 语法(标准写法)

select 字段名
from 表1
inner join 表2
on 连接条件
and 其他筛选条件;
  • inner join:内连接关键字(inner可省略,直接写join);
  • on:指定表之间的关联条件(如两表的主键 / 外键关联);
  • 区别于老式的where筛选,on更清晰地分离 “连接条件” 和 “业务筛选条件”。

2.2 PPT 实战案例:查询 SMITH 的姓名和部门名称

已知员工表(emp)和部门表(dept)通过deptno字段关联,需求:查询员工 SMITH 的姓名和所属部门名称。

-- 标准内连接写法
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 内连接特点

  • 只显示两表中匹配成功的数据,匹配失败的记录会被过滤;
  • 关联条件是核心,若缺少onwhere筛选,会产生笛卡尔积(数据量爆炸,无意义);
  • 适用于需要 “仅展示有效关联数据” 的场景(如查询有部门的员工、有成绩的学生)。

三. 外连接:保留某张表的全部数据

外连接的核心是保留其中一张表的全部数据,另一张表匹配不到则显示 null,分为左外连接和右外连接,适用于 “需完整展示主表数据” 的场景。

3.1 左外连接(left join):保留左表全部数据

左外连接规则:左表的所有记录都会显示,右表仅显示匹配成功的记录,匹配失败则字段值为 null。

3.1.1 语法

select 字段名
from 表1  -- 左表(需完整保留的表)
left join 表2  -- 右表(匹配表)
on 连接条件;

3.1.2 实战案例:查询所有学生的成绩(含无成绩的学生)

  1. 先创建测试表并插入数据:
-- 创建学生表
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);
  1. 左外连接查询(保留所有学生,无成绩显示 null):
select *
from stu
left join exam
on stu.id = exam.id;  -- 连接条件:学生id与成绩表id一致
  1. 查询结果
idnameidgrade
1jack156
2tom276
3kitynullnull
4nononullnull

可以看到:左表(stu)的 4 名学生全部显示,即使 kity 和 nono 没有成绩(右表无匹配数据),也保留了他们的个人信息。

3.2 右外连接(right join):保留右表全部数据

右外连接规则:右表的所有记录都会显示,左表仅显示匹配成功的记录,匹配失败则字段值为 null

3.2.1 语法

select 字段名
from 表1  -- 左表(匹配表)
right join 表2  -- 右表(需完整保留的表)
on 连接条件;

3.2.2 实战案例:查询所有成绩(含无对应学生的成绩)

需求:显示所有成绩记录,即使该成绩没有对应的学生(如 exam 中 id=11 的成绩)。

select *
from stu
right join exam
on stu.id = exam.id;  -- 连接条件:学生id与成绩表id一致

3.2.3 查询结果:

idnameidgrade
1jack156
2tom276
nullnull118

可以看到:右表(exam)的 3 条成绩全部显示,即使 id=11 的成绩没有对应学生(左表无匹配数据),也保留了该成绩记录。

四. 综合实战:列出部门及员工(含无员工的部门)

需求:查询所有部门名称及对应员工信息,即使某个部门没有员工,也需要显示该部门名称。
已知:部门表(dept)和员工表(emp)通过deptno字段关联,两种实现方式如下:

4.1 方法一:左外连接(以部门表为左表)

select d.dname, e.*
from dept d  -- 左表:部门表(需完整保留)
left join emp e  -- 右表:员工表(匹配表)
on d.deptno = e.deptno;  -- 连接条件:部门号一致

4.2 方法二:右外连接(以部门表为右表)

select d.dname, e.*
from emp e  -- 左表:员工表(匹配表)
right join dept d  -- 右表:部门表(需完整保留)
on d.deptno = e.deptno;  -- 连接条件:部门号一致

两种方法结果完全一致:所有部门都会显示,无员工的部门对应的员工字段(e.*)会显示 null。

五. 内外连接核心区别(一张表看懂)

连接类型核心逻辑关键字适用场景
内连接只保留两表匹配成功的数据inner join查询有效关联数据(如有部门的员工)
左外连接保留左表全部数据,右表匹配不到显示 nullleft join完整展示左表数据(如所有学生成绩)
右外连接保留右表全部数据,左表匹配不到显示 nullright join完整展示右表数据(如所有成绩记录)

六. 避坑指南和总结(开发必备)

  • 连接条件不可少:忘记onwhere筛选会产生笛卡尔积(如 stu 表 4 条数据 + exam 表 3 条数据 = 12 条无效数据);
  • onwhere的区别on用于指定 “表连接条件”,where用于筛选 “连接后的结果集”,逻辑上先执行on再执行where
  • 字段歧义需加别名:当两表有同名字段(如 id),查询时需用表别名.字段名区分(如stu.idexam.id);
  • 外连接的 “主表” 选择:需完整保留数据的表作为左表(左连接)或右表(右连接),避免搞反导致数据丢失。

总结

MySQL 多表连接是日常开发的核心技能,核心要点总结:

  • 内连接(inner join):取两表交集,适用于有效关联数据查询;
  • 左外连接(left join):保留左表全部数据,适用于完整展示主表 + 关联数据;
  • 右外连接(right join):保留右表全部数据,与左连接可灵活转换;
  • 所有连接查询需明确 “连接条件”,避免笛卡尔积,字段歧义加别名。

结尾:

到此这篇关于MySQL 多表连接查询实战指南:内连接 + 外连接的文章就介绍到这了,更多相关mysql多表连接查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 分享MySQL 主从延迟与读写分离的七种解决方案

    分享MySQL 主从延迟与读写分离的七种解决方案

    这篇文章主要介绍了分享MySQL 主从延迟与读写分离的七种解决方案,常见的解决方式是分库分表,每次读写都是操作主库的一个分表,从库只用来做数据备份。当主库发生故障时,主从切换,保证集群的高可用性,下面详细的相关资料介绍,需要的小伙伴可以参考一下
    2022-03-03
  • MySQL主从复制数据同步的实现步骤

    MySQL主从复制数据同步的实现步骤

    MySQL主从复制是一种数据同步技术,通过将数据从主数据库服务器复制到一个或多个从数据库服务器来实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Mysql中Table ‘XXX’ is marked as crashed and last (automatic?)问题解决方法

    Mysql中Table ‘XXX’ is marked as crashed and last (automatic?)

    这篇文章主要介绍了Mysql中Table ‘XXX’ is marked as crashed and last (automatic?)问题解决方法,需要的朋友可以参考下
    2014-05-05
  • mysql 列转行的技巧(分享)

    mysql 列转行的技巧(分享)

    下面小编就为大家带来一篇mysql 列转行的技巧(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Mysql安装与配置调优及修改root密码的方法

    Mysql安装与配置调优及修改root密码的方法

    这篇文章给大家介绍了Mysql安装与配置调优,然后在文中给大家提到了mysql修改root密码的多种方法,需要的的朋友参考下吧
    2017-07-07
  • centos7安装mysql并jdbc测试教程

    centos7安装mysql并jdbc测试教程

    这篇文章主要为大家详细介绍了centos7安装mysql并jdbc测试教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • MySQL中UNION 和 JOIN 多表联合查询方式

    MySQL中UNION 和 JOIN 多表联合查询方式

    本文介绍了在MySQL中UNION和JOIN两种多表查询的方式,包括它们的适用场景、语法和特性,JOIN用于关联数据,而UNION用于合并具有相同结构但无直接关系的数据,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 常见的数据库1045密码错误问题解决方法

    常见的数据库1045密码错误问题解决方法

    连接MySQL数据库时难免会遇到1045错误,主要是因为用户输入的用户名或密码错误被拒绝访问,下面这篇文章主要给大家介绍了关于常见的数据库1045密码错误问题的解决方法,需要的朋友可以参考下
    2023-04-04
  • MySql分表、分库、分片和分区知识点介绍

    MySql分表、分库、分片和分区知识点介绍

    数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表,这里就为大家介绍一下,需要的朋友可以参考下
    2020-02-02
  • MySQL中如何优化order by语句

    MySQL中如何优化order by语句

    本文主要介绍了MySQL中如何优化order by语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01

最新评论