时间:2021-07-01 10:21:17 帮助过:17人阅读
成绩表(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