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

Posted 戴同学的工作随笔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中各种连接的区别是什么相关的知识,希望对你有一定的参考价值。

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中各种连接的区别是什么的主要内容,如果未能解决你的问题,请参考以下文章

sql 各种连接的使用条件,

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

这两个代码片段有啥区别?

ensp中各种线的区别

SQL Server 2008 中嵌套循环连接和哈希连接的区别

SQL语言中的单引号与双引号区别