一文带你彻底搞懂MySQL数据库中的内外连接

 更新时间:2026年05月14日 08:47:25   作者:重生之小比特  
在 MySQL 多表查询中,表连接是最核心,最常用的知识点,这篇博客将用最通俗的语言,带你彻底搞懂内连接、左外连接、右外连接,看完直接上手写 SQL

在 MySQL 多表查询中,表连接是最核心、最常用的知识点,不管是业务开发还是面试,都是高频考点。这篇博客我用最通俗的语言,带你彻底搞懂内连接、左外连接、右外连接,看完直接上手写 SQL。

一、先搞懂:为什么需要表连接?

实际业务里,数据不会只存在一张表中。比如:

  • 员工信息存在 emp
  • 部门信息存在 dept
  • 学生信息存在 stu 表,成绩存在 exam

同时查员工 + 部门、学生 + 成绩,就必须用表连接,把多张表按关联字段拼起来查询。

表连接本质:把多张表按关联条件组合,返回符合要求的结果集

二、内连接(INNER JOIN):只保留匹配的数据

1. 核心概念

内连接 = 取两张表的交集只返回两张表能匹配上的数据,匹配不上的直接丢弃

我们平时写的 from 表1,表2 where 条件,本质就是内连接。

2. 标准语法

SELECT 字段名 
FROM 表1 
INNER JOIN 表2 
ON 连接条件 
AND 其他筛选条件;
  • INNER JOIN:内连接关键字
  • ON:写表与表之间的关联条件(必须有)
  • AND:额外的筛选条件

3. 实战案例

需求:查询员工 SMITH 的名字和所属部门名称。

-- 老式写法(等价内连接)
SELECT ename, dname 
FROM emp, dept 
WHERE emp.deptno = dept.deptno 
AND ename = 'SMITH';

-- 标准内连接写法(推荐)
SELECT ename, dname 
FROM emp 
INNER JOIN dept 
ON emp.deptno = dept.deptno 
AND ename = 'SMITH';

结果:只返回 SMITH 及其对应部门,无匹配的数据不会出现。

三、外连接:保留 “不匹配” 的数据

外连接和内连接最大区别:会保留某张表的全部数据,即使另一张表没有匹配项,也会显示,补 NULL。

外连接分两种:左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)

1. 左外连接(LEFT JOIN):左边表全显示

核心概念

  • 左表完全显示
  • 右表只显示匹配上的数据
  • 匹配不上 → 右表字段补 NULL

标准语法

SELECT 字段名 
FROM 表1(左表)
LEFT JOIN 表2(右表)
ON 连接条件;

实战案例

先建测试表:

-- 学生表
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);
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);

需求:查询所有学生的成绩,没成绩的学生也要显示

SELECT * 
FROM stu 
LEFT JOIN exam 
ON stu.id = exam.id;

结果:

  • jack、tom:有成绩,正常显示
  • kity、nono:无成绩,成绩字段显示 NULL
  • 成绩表 11 号:不匹配学生,不显示

2. 右外连接(RIGHT JOIN):右边表全显示

核心概念

  • 右表完全显示
  • 左表只显示匹配上的数据
  • 匹配不上 → 左表字段补 NULL

标准语法

SELECT 字段名 
FROM 表1
RIGHT JOIN 表2(右表)
ON 连接条件;

实战案例

需求:显示所有成绩,哪怕没有学生对应也要显示

SELECT * 
FROM stu 
RIGHT JOIN exam 
ON stu.id = exam.id;

结果:

  • 成绩 1、2、11 全部显示
  • 11 号成绩无匹配学生,学生字段补 NULL

四、高频练习:部门 + 员工(经典面试题)

需求:列出所有部门名称 + 员工信息,包括没有员工的部门

两种等价写法:

-- 方法1:部门左连接员工(推荐)
SELECT d.dname, e.* 
FROM dept d 
LEFT JOIN emp e 
ON d.deptno = e.deptno;

-- 方法2:员工右连接部门
SELECT d.dname, e.* 
FROM emp e 
RIGHT JOIN dept d 
ON d.deptno = e.deptno;

效果:所有部门都显示,没员工的部门,员工字段为 NULL。

五、一张图总结:内连接 vs 左 / 右连接

表格

连接类型关键字保留数据适用场景
内连接INNER JOIN两张表的交集只查匹配数据
左外连接LEFT JOIN左表全部数据以左表为主,查全部 + 关联
右外连接RIGHT JOIN右表全部数据以右表为主,查全部 + 关联

简单记:

  • 要交集 → 内连接
  • 要某张表全量数据 → 左 / 右连接
  • 左连接 = 左边全显;右连接 = 右边全显

到此这篇关于一文带你彻底搞懂MySQL数据库中的内外连接的文章就介绍到这了,更多相关MySQL数据库内外连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL主键作用与使用方法详解

    MySQL主键作用与使用方法详解

    主键是数据库表中的一个或多个字段(列),它的值用于唯一地标识表中的某一条记录,这篇文章主要介绍了MySQL主键作用与使用方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • MySQL 系统变量(查看,修改)

    MySQL 系统变量(查看,修改)

    MySQL的系统变量是由MySQL服务器管理的,用于控制服务器的各种行为和特性,本文主要介绍了MySQL 系统变量(查看,修改),感兴趣的可以了解一下
    2024-08-08
  • MySQL 触发器的使用和理解

    MySQL 触发器的使用和理解

    这篇文章主要介绍了MySQL 触发器的使用和理解,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-02-02
  • 详解SQL四种语言:DDL DML DCL TCL

    详解SQL四种语言:DDL DML DCL TCL

    本文详细介绍了sql的四种语言,包括数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)和事物控制语言(TCL)。在这几种语言中有疑惑的可以来看看这篇文章。
    2016-07-07
  • mysql慢查询日志分析工具使用(pt-query-digest)

    mysql慢查询日志分析工具使用(pt-query-digest)

    这篇文章主要介绍了mysql慢查询日志分析工具使用(pt-query-digest),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL慢日志实践小结

    MySQL慢日志实践小结

    这篇文章主要介绍了MySQL慢日志实践小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • mysql错误处理之ERROR 1665 (HY000)

    mysql错误处理之ERROR 1665 (HY000)

    最近一直在mysql的各个版本直接徘徊,这中间遇到了各种各样的错误,将已经处理完毕的几个错误整理了一下,分享给大家,这次我们来看看错误提示 ERROR 1665 (HY000)
    2014-07-07
  • MySQL查询优化之explain的深入解析

    MySQL查询优化之explain的深入解析

    本篇文章是对MySQL查询优化中的explain进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • linux下mysql忘记密码的解决方法

    linux下mysql忘记密码的解决方法

    这篇文章主要为大家详细介绍了linux下mysql忘记密码的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • mysql 一个较特殊的问题:You can''t specify target table ''wms_cabinet_form''

    mysql 一个较特殊的问题:You can''t specify target table ''wms_cabinet

    mysql 一个较特殊的问题:You can't specify target table 'wms_cabinet_form' for update in F
    2010-11-11

最新评论