MySQL表的内外连接

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

一.内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。而使用where进行笛卡尔积筛选的时候,后面必须跟着一个过滤条件,将不合理的数据筛选掉,并且这时候再跟着其他条件就需要and其他条件,所以这种方式的内连接虽然可以,但是容易将内连接的条件与其他约束条件混淆,不容易区分。

于是,为了能够特殊标注其是内连接,就采用了如下语句:

select 字段 from1 inner join2 on 连接条件 and 其他条件;

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

这时,我们可以用多表查询,并笛卡尔积方式连接,并进行筛选:

image-20230731171311459

采用内连接的方式:

image-20230731171428834

采用内连接的方式,就可以很好的将内连接的条件与其他条件进行区分。

二.外连接

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

1. 左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。即有可能出现这样的情况:学生表里有四个人,但成绩表中只有三个成绩,这种情况还是常见的,因为存在着部分学生没有考试的情况,但是此时我们仍想将已知的信息显示出来,那么在连接时就会出现空值的情况。

即将学生表放在左侧,成绩表放在右侧,此时左侧的表完全显示,右侧的表由于缺少对应的一条信息,其内部的值为空。语法与内连接的区别就是将inner替换成了left。

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);

image-20230731191753498

由于其中一个id无法匹配,所以该学生没有对应的成绩。如果将stu与exam的位置反过来,则会显示exam的全部信息,然后将stu能匹配上的属于与exam进行匹配。

image-20230731191937132

2. 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接。这与左外连接的规则是一样的,只不过主导的表变成了右侧。

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

image-20230731192259612

实际上,只有一个左外连接已经够了,因为我们可以将表的位置交换,这与右外连接没什么区别。

三.案例

案例:列出部门名称和这些部门的员工信息,同时列出没有员工的部门。

image-20230731192659587

通过观察,emp表中不存在部门号为40的员工。从上面要求:同时列出没有员工的部门可以看出,部门为主,因此若选择左外连接,部门表在左侧;选择右外连接,部门表在右侧。

select * from dept left join emp on dept.deptno=emp.deptno order by dept.deptno;

image-20230731193102085

这就统计出来了我们想要的结果。

猜你喜欢

转载自blog.csdn.net/NEFUT/article/details/132049842