码迷,mamicode.com
首页 > 数据库 > 详细

SQL中各种连接的区别是什么

时间:2020-05-12 16:50:51      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:image   说明   工作   场景   color   vlookup   语句   保护   strong   

SQL查询数据的时候,经常需要通过Join连接,把几个表的数据组合在一起查询,有点类似Excel的Vlookup,但又有多种不同的形态,下面以一个常见的业务场景为例,简单介绍一下区别:

某班级开展了期中考试,成绩出来之后,为了保护学渣的隐私,老师在群里面发布的成绩表没有学生姓名,只有学号、课程、成绩,其中小曾同学能力出众,比别人多考了一门数学:

成绩表(A)
ID Course Mark
学号 课程 成绩
1 语文 99
1 数学 100
2 语文 60
3 语文 70

至于具体学生姓名,老师自己另外有一个学生姓名表进行登记,不过由于老师工作比较马虎,这个姓名表登记不太完整:

学生表(B)
ID Name
学号 姓名
1 小曾
2 小陈
4 小黄

现在如果老师想做一个完整的成绩表,包含了学号、课程、成绩及姓名的,类似如下格式,就需要用到Join语句了:

完整成绩表(C)
ID Course Mark Name
学号 课程 成绩 姓名
       
       
       
       
       
       

场景一:老师只想知道成绩表里面这些人究竟是谁,至于没来参加考试的,即便在姓名表里面,也不需要知道。

这个时候就需要使用Left Join了:以左表为准,匹配右表,右有就返回,没有就为空。

技术图片

Select A.ID,A.Course,A,Mark,B.Name from A left join B on a.ID=B.ID

结果如下:

完整成绩表(C)
ID Course Mark Name
学号 课程 成绩 姓名
1 语文 99 小曾
1 数学 100 小曾
2 语文 60 小陈
3 语文 70

Null

说明:

虽然3号同学语文考了70分,但是学生表中没有他,作为无名之辈,他的姓名体现为Null。

虽然4号同学在学生表中,但是他没来参加考试,所以结果直接没有他。

 

场景二:老师只想知道学生表里面这些人的考试成绩,至于不在学生表中的人,考100人老师也不关心。

这个时候就需要使用Right Join了:以右表为准,匹配左表,左表有就返回,没有就为空。

技术图片

Select A.ID,A.Course,A,Mark,B.Name from A Right Join B on a.ID=B.ID

结果如下:

完整成绩表(C)
ID Course Mark Name
学号 课程 成绩 姓名
1 语文 99 小曾
1 数学 100 小曾
2 语文 60 小陈
4 Null Null 小黄

说明:

小黄同学在学生表中,但是没参加考试,所以课程及成绩为Null。

虽然3号同学语文考了70分,但是学生表中没有他,所以结果直接没有他。

 

场景三:老师只想知道在学生表里面,并且参加了考试的人的成绩。

这个时候就需要用到Inner Join了:两表匹配,只有两个表中都有的数据才返回。

技术图片

Select A.ID,A.Course,A,Mark,B.Name from A inner join B on a.ID=B.ID

结果如下:

完整成绩表(C)
ID Course Mark Name
学号 课程 成绩 姓名
1 语文 99 小曾
1 数学 100 小曾
2 语文 60 小陈

说明:

小黄同学在学生表中,但是没参加考试,所以结果直接没有他。

虽然3号同学语文考了70分,但是学生表中没有他,所以结果直接没有他。

 

场景四:老师什么都想知道,要一个最完整的表,没来考试或者来考试但没有姓名的都要列出来。

这个时候就需要用到Full Outer Join了:两表匹配,只要任意一个表有的数据就都返回。

技术图片

Select A.ID,A.Course,A,Mark,B.Name from A full outer join B on a.ID=B.ID

结果如下:

完整成绩表(C)
ID Course Mark Name
学号 课程 成绩 姓名
1 语文 99 小曾
1 数学 100 小曾
2 语文 60 小陈
3 语文 70 Null
4 Null Null 小黄

说明:

3号同学是无名之辈,所以姓名是Null。

小黄同学没参加考试,所以课程及成绩都是Null。

SQL中各种连接的区别是什么

标签:image   说明   工作   场景   color   vlookup   语句   保护   strong   

原文地址:https://www.cnblogs.com/daiyudong/p/12876906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!