【一起来补课】一文彻底搞懂Left Join、Right 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

在这里插入图片描述

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
左连接(left join)和右连接(right join)是关系型数据库中的两种连接方式,用于将两个或多个表中的数据进行关联查询。 左连接(left join)返回左表中的所有记录,以及右表中与左表中记录匹配的记录。如果右表中没有与左表中记录匹配的记录,则返回NULL值。 右连接(right join)与左连接相反,返回右表中的所有记录,以及左表中与右表中记录匹配的记录。如果左表中没有与右表中记录匹配的记录,则返回NULL值。 内连接(inner join)是左连接和右连接的交集,返回左表和右表中都存在的记录。 当左连接和右连接的结果相同时,可以使用内连接来替代。内连接只返回左表和右表中都存在的记录,不会返回NULL值。 例如,如果使用左连接查询学生表(stuinfo)和成绩表(score),可以得到所有学生的成绩信息,包括没有成绩的学生(NULL值)。而使用内连接查询相同的表,则只会返回有成绩的学生信息,不会返回没有成绩的学生信息。 总结起来,左连接和右连接是根据连接的方向来确定返回的记录,而内连接是根据两个表中的匹配条件来确定返回的记录。 #### 引用[.reference_title] - *1* [left join(左连接)、right join(右连接)、full join(全连接)、inner join(内连接)、cross join(笛卡尔积)...](https://blog.csdn.net/qq_39072649/article/details/104551392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【一起来补课一文彻底搞懂Left JoinRight JoinInner Join](https://blog.csdn.net/weixin_39615182/article/details/116422824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小样x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值