一起来补课一文彻底搞懂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的主要内容,如果未能解决你的问题,请参考以下文章