首先先来介绍一下我做的两个表,然后再用他们两个举例说明。
-- 创建教师表
create table teachers(
id_t int primary key auto_increment, -- 老师编号
name_t varchar(5) -- 姓名
);
-- 创建学生表
create table students(
id_s int primary key auto_increment, -- 编号
name_s varchar(5), -- 姓名
gender_s char(1), -- 性别
age_s int, -- 年龄
admission_date date, -- 入学日期
teacher_s int -- 教学老师
);
这是学生表
这是教师表
外连接
其中外连接又分为左外连接和右外连接。
其实这两个都可以查表1 表2的所有数据,那他们具体有什么不一样呢
左外连接(LEFT JOIN)会返回左表中的所有记录,无论它们是否在右表中找到匹配的记录。如果在右表中没有找到匹配的记录,则结果集中右表的字段将为NULL。
右外连接(RIGHT JOIN)与左外连接正好相反,它会返回右表中的所有记录,无论它们是否在左表中找到匹配的记录。如果在左表中没有找到匹配的记录,则结果集中左表的字段将为NULL。
那我们先给这个表加一行存在null值的数据。
insert into students values (8,'胡二','女',19,'2021-9-1',null);
-- 右外连接
select * from teachers t1 right join students s1 on t1.id_t = s1.teacher_s;
-- 左外连接
select * from teachers t1 left join students s1 on t1.id_t = s1.teacher_s;
以上我们可以看出,左右外连接是由左右表作为主体全部显示的,如果这时另一个表没有主体表的值,那么主体表全部显示,另一个表全部显示null值或不存在(我貌似说不清,反正看一看上面例子就可以清楚了)
========================================================
我们具体再实验一下如果没有null值的查询结果吧
-- 右外连接
select * from teachers t1 right join students s1 on t1.id_t = s1.teacher_s;
-- 左外连接
select * from teachers t1 left join students s1 on t1.id_t = s1.teacher_s;
我们可以清晰的看出来这两个的查询结果一样,但是顺序却不同。
将t1看作左表,s1看作右表
查询出左右顺序,是按你写的查询语句左右表的位置来说的(就是见上语句,t1在左,s1在右,所以查询出来的结果就是教师表在学生表的右边)
右外连接:右边的表是主体,是按s1的主键安排的序
左外连接:左边的表是主体,是按t1的主键安排的序