一起来补课一文彻底搞懂Left JoinRight Join和Inner Join

Posted 小样5411

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起来补课一文彻底搞懂Left JoinRight Join和Inner Join相关的知识,希望对你有一定的参考价值。

前言

大家静下心,这篇文章一定带你搞懂连表查询中的Left Join、Right Join和Inner Join

三个连表查询

1、left join和right join

在这里插入图片描述
先来用图解释这三个查询,Left Join就是以左边为基准,Inner Join就是查两个重复的部分,Right Join就是以右边为基准。

比如select … from A left join B 表示以A为基准,连接B中某列或某些列,最后查询出的大部分都是A中内容

同理,select … from A right join B 表示以B为基准,连接A中的某列或某些列,最后大部分都是B中的内容

select … from A inner join B 表示查两个共有的内容

我们在实际mysql代码中体验一下,以stuInfo表、subject表、score表这三个表作为测试。下面是创建表的代码

stuInfo表创建

CREATE TABLE `student`.`stuInfo` (  
  `stuNum` INT NOT NULL AUTO_INCREMENT COMMENT '学号',
  `stuName` VARCHAR(10) COMMENT '姓名',
  `sex` INT COMMENT '性别:0-女,1-男',
  `address` VARCHAR(60) COMMENT '地址',
  `bornDate` DATE COMMENT '出生日期',
  `gradeId` INT COMMENT '成绩Id',
  PRIMARY KEY (`stuNum`) 
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;

subject表

CREATE TABLE  `student`.`subject` (
  `subjectNum` int(11) NOT NULL AUTO_INCREMENT COMMENT '科目号',
  `subjectName` varchar(10) DEFAULT NULL COMMENT '科目名称',
  `classHour` int(11) DEFAULT NULL COMMENT '课程学时',
  `gradeId` int(11) DEFAULT NULL COMMENT '成绩Id',
  PRIMARY KEY (`subjectNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

score表

CREATE TABLE `student`.`score` (  
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '得分id',
  `stuNum` INT COMMENT '学号',
  `subjectNum` INT COMMENT '科目号',
  `examDate` DATE COMMENT '考试时间',
  `stuScore` INT COMMENT '分数',
  PRIMARY KEY (`id`) 
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;

stuinfo表中插入些数据
在这里插入图片描述
subject表中插入些数据
在这里插入图片描述
score表中插入些数据
在这里插入图片描述
sql文件,可以直接复制下面内容这个创建+插入

现在我们直接写sql语句来了解这三个联表查询
1、Left Join
首先我们可以确定交叉部分,比如stuinfo表和score表就有两个相同的列—stuNum,可以作为连接条件,我们要查(学号,姓名,科目编号,分数)

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
LEFT JOIN score sc ON stu.stuNum=sc.stuNum

在这里插入图片描述
Left Join左边stuinfo表就是基准,可以理解为左边的stuinfo表不动,将score 表中的内容拼接过来。

2、Right Join
同理用Right Join,下面看上去和Left Join一模一样,就是Left变为Right

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
RIGHT JOIN score sc ON stu.stuNum=sc.stuNum

在这里插入图片描述
这里结果是一样的,但是Right Join就是以右边的score表为基准了,有人可能会说这不是一样吗,别急,下面来看看不一样的,上面这个例子只是既可以用Left Join又可以用Right Join,查出的效果相同,那两个效果不同的时候呢?我们来看看不同的时候

Left Join和Right Join对比
我们在stuinfo中插入一个条新学生数据,但其他表不插入,就表示改该学生没有参加过考试
在这里插入图片描述
执行下面sql

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
LEFT JOIN score sc ON stu.stuNum=sc.stuNum

在这里插入图片描述
发现这个新加入的学生查出来了,但是没有成绩

同样用right join对比一下

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
RIGHT JOIN score sc ON stu.stuNum=sc.stuNum

在这里插入图片描述
发现没有查出新学生的信息

结论

left join即使右表中没有匹配,也会返回左表中所有的值
right join即使左表中没有匹配,也会返回右表中所有的值

这里因为right join的右边没有新加入的学生成绩信息,所以没有查出来yx5411的信息

于是我们利用left join,right join就可以做一些实际性的查询,比如需要查询缺考的同学,刚刚yx5411就属于缺考,我们查他,只要在上面基础上加一个条件为成绩为空

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
LEFT JOIN score sc ON stu.stuNum=sc.stuNum
WHERE stuScore IS NULL

在这里插入图片描述
还可以在这个基础上查询,参加了考试的学生的学号,姓名,科目名,得分

分析:要求查参加了考试的学生,那么就是先score表作为基准,右连接它,因为有成绩的都表示参加了考试的,然后再left join subject,左边整个作为基准连上一个subject,加上条件,并将得到subjectNum变为subjectName即可

SELECT stu.stuNum,stu.stuName,subjectName,stuScore
FROM stuinfo stu
RIGHT JOIN score sc ON stu.stuNum=sc.stuNum
LEFT JOIN `subject` sub ON sub.subjectNum=sc.subjectNum

在这里插入图片描述

2、inner join

先说第一个点:left join和right join都能用且效果相同时,inner join也能用。我们看看将之前的一个查询换成inner join,效果相同。left join和right join效果不同时,inner join查到结果为空,相当于就是没有交集

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
INNER JOIN score sc ON stu.stuNum=sc.stuNum

在这里插入图片描述
left join 和 right join不同情况,如用left join查到下面情况,换成inner join呢,会为空,所以left join和right join结果相同时,可以用inner join,也就是交集相同,不同时,inner join查不到数据
在这里插入图片描述

SELECT stu.stuNum,stu.stuName,subjectNum,stuScore
FROM stuinfo stu
INNER JOIN score sc ON stu.stuNum=sc.stuNum
WHERE stuScore IS NULL

在这里插入图片描述

以上是关于一起来补课一文彻底搞懂Left JoinRight Join和Inner Join的主要内容,如果未能解决你的问题,请参考以下文章

一文彻底搞懂单例模式

一文彻底搞懂 CMS GC 参数配置

一文让你彻底搞懂 WebSocket 的原理

一文彻底搞懂Kafka

一文彻底搞懂Kafka

一文彻底搞懂HBase