sql中join的理解

Easter79
• 阅读 525

前言

为什么会突然写这个blog呢?因为之前有只青蛙小姐姐问我,能不能教她join,当时上大学老师怎么教她也不会。然后本来想面对面交流给她说明,后面阴错阳差,就延误到了现在。

所以我想,我可以提前准备好我想说的东西,记录下来,顺便自己也回忆下join(ps:为什么我需要回忆?因为之前的公司都是面向互联网的、高并发的业务,用join的话,很容易导致数据库出现异常问题,我已经很久没用过了)。

当然有机会的话,我觉得还是要当面给她讲。

join是什么,为什么要有join

这个就很重要了,学一个东西你都不知道它是什么,有什么应用场景的话,基本是学完就忘。

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

举个🌰:

栗子当然是要用学校的栗子啊,在学校的时候吃栗子还是蛮有感觉的,现在吃个🌰,都习以为常了。

学生表(student)      uid,name
成绩表(achievement)  uid,score

这个时候我们要怎么去查询学生的成绩呢?

如果不用连表,我们可能就需要2条sql.

select * from student where uid = x
select * from achievement where uid = x

这样是不是很繁琐。

假如我们有join了,那就很好操作了。

select * from student join achievement on student.uid = achievement.uid where uid = x

join的分类

join分为3种情况,分别是inner、left、right。从字面上,我们就能理解为全、左、右

sql中join的理解

inner join

inner join(等值连接) 只返回两个表中联结字段相等的行。

怎么理解呢?还是拿学生来举例。

select * from student inner join achievement on student.uid = achievement.uid where uid = x

比如一个班有30个学生,但是只有28个人参加的考试。

如果使用inner会展示出参加考试的学生及其成绩

left join

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

怎么理解呢?还是拿学生来举例。

select * from student left join achievement on student.uid = achievement.uid where uid = x

比如一个班有30个学生,但是只有28个人参加的考试。

如果使用left会展示出所有的学生,没有成绩的会补充为Null。

right join

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

right join一般用于右表数据比较多的情况。

还是拿学生来举例吧。

select * from student right join achievement on student.uid = achievement.uid where uid = x

比如一个班去年有33个学生,但是有3个人休学了。如果查询去年的成绩的话。

就会得到33条记录,而休学的3个同学的姓名是无法获知了,会和left join一样补充为null。

总结

因此很明显的,可以看出来

inner返回是完全匹配

left和right返回的数据是部分匹配但是会将其中一张表数据匹配到的完全返回,而将不完全的表的值填充为空。

至于left和right表,就这么理解,如果是left,那left左边的表名就是完全返回的,如果是right,则反之。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
2年前
SQL JOIN 简单介绍
前言本文还是秉持之前一贯的写作风格,以简单易懂的示例帮助大家了解各种join的区别。为什么需要join为什么需要join?join中文意思为连接,连接意味着关联即将一个表和多个表之间关联起来。在处理数据库表的时候,我们经常会发现,需要从多个表中获取信息,将多个表的多个字段数据组装起来再返回给调用者。所以join的前提是这
Stella981 Stella981
2年前
Flink SQL 实战:双流 join 场景应用
本文主要介绍在流式场景中join的实战。大家都知道在使用SQL进行数据分析的过程中,join是经常要使用的操作。在离线场景中,join的数据集是有边界的,可以缓存数据有边界的数据集进行查询,有NestedLoop/HashJoin/SortMergeJoin等多表join;而在实时场景中,join两侧的数据都是无边界的数据流,所以缓
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k