LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【MySQL】表的内连接和外连接

zhenglin
2026年3月4日 9:28 本文热度 121

表的连接分为内连接和外连接


1. 内连接

内连接实际上就是利用where子句对两张表的笛卡儿积进行筛选(即我们之前加的过滤条件,过滤掉无意义的数据),即内连接 = 笛卡尔积 + 过滤条件
所以我们前面两篇文章中学到的某些查询就是内连接,这也是在开发过程中使用的最多的连接查询。


语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

来看一个

案例:显示员工SMITH的名字和部门名称

用之前的写法:

员工姓名在emp表中,部门名称在dept表中,所以要从两表的笛卡尔积中筛选

select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';

 

如果用标准的内连接写法:

那就应该是这样的

select ename,dname from emp inner join dept on dept.deptno=emp.deptno and ename='SMITH';

总结一下笛卡尔积和内连接的区别:


2. 外连接

外连接分为左外连接和右外连接

2.1 左外连接

在连接查询中:

左外连接返回即左表中的所有行,即使右表中没有匹配的行,右表的列会用 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);

 

观察一下这两张表会发现:学生表中有四名学生,成绩表中有三名学生的成绩。但是不是学生表中每个学生都有成绩,且不是成绩表中的每个学生都出现在学生表中。
之所以这样设计,就是为了大家更好的理解左外连接和右外连接。


下面看具体的例子

案例

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
怎么做呢?

准备工作:

如果大家学习过数据库系统概论的话,肯定是知道左外连接和右外连接是什么的。
那这里就结合着课本上的理论进行一个讲解:
前面我们讲了内连接,内连接 = 笛卡尔积 + 过滤条件。
比如我们前面的例子中


连接条件是两表的deptno属性是相等的(在数据库系统概论中这叫做等值连接,在等值连接的基础上把重复的列去掉叫做自然连接)
但是有些情况下,一张表的某个属性值在另一张表中可能找不到相等的值,比如我们刚才新建的表中

  


stu表中id值3,4和exam表中id值11。两张表都有id这个属性,但是这几个值在另一张表中找不到相等的值。
这时候如果我们对两表进行等值连接(内连接的一种,把过滤条件限定为两表的某个属性列相等)

那么那些不能存在相等的属性值的记录就会被舍弃,这些被舍弃的记录在数据库系统概论中被称为“悬浮元组”

  

什么是外连接,什么是左/右外连接

然后就可以引出外连接的概念了:

如果把悬浮元组也保留在结果中,其它属性填上空置,那么这种连接就叫做外连接。
如果只保留左表中的悬浮元组,那就叫左外连接
如果只保留右表中的悬浮元组,那就叫右外连接


所以,对于上面两张表,外连接的结果应该是这样的


那么左外连接就应该是这样:

 

只保留左表的悬浮元组嘛

那这个结果是啥啊,回看上面的题目:
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
所以左外连接的结果不就是题目想要的嘛。

学生id为3,4的两名学生没有成绩,但是也把信息也是出来了。



那我们来试一下,对这两张表进行左外连接(语法上面介绍过了)

没有问题,和我们分析的一模一样,所以这个案例题目的答案就是
select * from stu left join exam on stu.id=exam.id;

 

2.2 右外连接

下面再看右外连接,就很简单了,概念上面已经介绍过了

如果只保留右表中的悬浮元组,那就叫右外连接。
即返回右表中的所有行,即使左表中没有匹配的行,左表的列会用 NULL 填充。


语法:

select 字段 from 表名1 right join 表名2 on 连接条件;

案例:把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来


现在看到这个题目,相信大家就能直接反应出来要用外连接(当然左表和右表对应的顺序如果调换,那左外连接和右外连接也要调换,还按上面的左右顺序,那这就应该用右外连接)

select * from stu right join exam on stu.id=exam.id;

 

2.3 练习

回到之前的三张测试表:
列出部门名称和这些部门的员工信息,同时列出没有员工的部门

分析一下:

首先这些信息涉及两个表,所以要进行笛卡尔积,然后肯定要过滤掉无意义的信息(这其实就是内连接)。
但是这样的话我们知道回丢弃掉那些不存在等值属性的记录(悬浮元组)。
要保留他们,就要进行外连接。根据左右表的顺序选择合适的外连接方法(左 or 右)



下面来看这道题的场景

先看一下这两张表


会发现40号部门是没有员工的,如果内连接(笛卡尔积+过滤条件——两表的deptno相等)

那么dept表中的40号部门所在的记录则为悬空元组,会被舍弃。但是题目要求要列出没有员工的部门,所以要报了40号部门,那么就应该用外连接


左表右表的顺序不同,这里可以有两种写法

select dept.dname,dept.deptno,emp.* from dept left join emp on dept.deptno=emp.deptno;

如果调换两表的左右顺序,那就用右外连接

 

结果是一样的

 

参考文章:原文链接


该文章在 2026/3/4 9:29:00 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved