inner join 、 left join 和 right join 区别

准备工作

建student和score两张表,并导入数据:

DROP TABLE IF EXISTS student;
 
CREATE TABLE student(
id BIGINT(20) NOT NULL COMMENT '主键ID',
`name` VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
PRIMARY KEY(id) 
);

INSERT INTO student(id,`name`,age)
VALUES(1,'张三',20),
(2,'李四',22),
(3,'王五',20),
(4,'赵六',20)

SELECT id,`name`,age FROM student;
DROP TABLE IF EXISTS score;
 
CREATE TABLE score(
id BIGINT(20) NOT NULL COMMENT '主键ID',
math VARCHAR(30) NULL DEFAULT NULL COMMENT '数学成绩',
chinese VARCHAR(11) NULL DEFAULT NULL COMMENT '语文成绩',
english VARCHAR(11) NULL DEFAULT NULL COMMENT '英语成绩',
PRIMARY KEY(id) 
);

INSERT INTO score(id,math,chinese,english)
VALUES(1,'90','90','90'),
(3,'80','80','80'),
(5,'60','60','60'),
(7,'70','70','70')

SELECT id,math,chinese,english FROM score;

student表数据:

score表数据:

INNER JOIN

查询sql

SELECT student.id,student.`name`,score.math,score.english,score.chinese 

FROM student INNER JOIN score ON student.id = score.id;

执行结果:

再结合一下student和score两张表的数据看一下,是不是发现使用INNER JOIN做表连接查询的话匹配到的数据是两表都存在的,不存在什么null或者空对吧

注意:

使用INNER JOIN左右两边的表的位置可以互换

等一下还没完,再看看下面这条sql

SELECT student.id,student.`name`,score.math,score.english,score.chinese 

FROM student,score WHERE student.id = score.id;

执行结果:

是不是和INNER JOIN的效果一样?是不是也是你的最爱?

其实我写这条sql不是为了证明什么,只是想告诉你不要这么写

这么写它会形成一种“笛卡尔积”现象,有兴趣的小伙伴可以去百度一下,反正我现在已经不会这么写了

下面我们再来看看LEFT JOIN和RIGHT JOIN,但是我们如果要搞清楚他俩,需要先知道什么是主表,什么是从表

主表和从表

举个例子:

学生和分数哪个先存在?

答案当然是学生。

所有说我们这次实验的两张表中的学生表(student)就是主表,分数表(score)则是从表

再举个例子:

消费表和消费明细表哪个表是主表?哪个表是从表?

很明显没有消费表就不可能存在消费明细表

所以说消费表就是主表,而消费明细表就是从表

知道了主表和从表就来看看LEFT JOIN和RIGHT JOIN吧

LEFT JOIN

查询sql

SELECT student.id,student.`name`,score.math,score.english,score.chinese 

FROM student LEFT JOIN score ON student.id = score.id;

执行结果:

是不是发现id为2和4的两行数据除了name字段其他的字段都是Null

没错LEFT JOIN就是以左表为主表,右表为从表

它以左边的表为主表匹配右边的从表,从表不存在的数据显示为Null

再来看看RIGHT JOIN

RIGHT JOIN

查询sql

SELECT student.id,student.`name`,score.math,score.english,score.chinese 

FROM student RIGHT JOIN score ON student.id = score.id;

执行结果:

是不是又发现了Null,而这次Null对应的字段都是student表存在的字段

没错RIGHT JOIN就是以右表为主表,左表为从表

它以右边的表为主表匹配左边的从表,从表不存在的数据显示为Null

它和LEFT JOIN完全相反

注意:

score和student两张表做表连接查询score表不可能是主表,我这边只是为了方便实验

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...