表的连接分为内连接和外连接
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 编辑过