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 Server 连接抛出异常 - 添加代码片段