谈谈SQL的多表关联(重点在最下面哟)

导读:本篇文章讲解 谈谈SQL的多表关联(重点在最下面哟),文章出自:https://blog.csdn.net/weixin_43316702/article/details/110181556希望对大家有帮助,欢迎收藏,转发!站点地址:www.javazhiyin.com.com

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

多表关联主要是用join关键字
join的用法分为几种:(引用其他人的资料)
参考:https://www.cnblogs.com/LyndonYoung/articles/7880491.html
1.自然连接(natural join)
自然连接将表中具有相同名称的列自动进行匹配,自然连接不必指定任何同等连接条件也不能认为指定哪些列需要被匹配,自然连接得到的结果表中,两表中名称相同的列只出现一次。
select * from employee natural join department;

2.内连接(inner join):产生的结果是A和B的交集(相同列里面的相同值)
内连接查询能将左表和右表中能关联起来的数据连接后返回,返回的结果就是两个表中所有相匹配的数据。
select * from TableA as A inner join TableB B on A.PK = B.PK;
select * from TableA as A inner join TableB B on A.PK > B.PK;
在这里插入图片描述
3.外连接(outer join)
内连接是要显示两张表的内存,而外连接不要求如此,外连接可以依据连接表保留左表,右表或全部表的行为而分为左外连接右外连接和全连接。
select * from TableA as A left(right/full) join TableB as B on A.PA = B.PK;

Full Join:产生的结果是A和B的并集(如果没有相同的值会用null作为值)
在这里插入图片描述

Left Join:产生表A的完全集,而B表中匹配的则有值(没有匹配的则以null值取代)
在这里插入图片描述

Right Join:产生表B的完全集,而A表中匹配的则有值(没有匹配的则以null值取代)
在这里插入图片描述
4.交叉连接(cross join)
又称笛卡尔连接,交叉连接返回两个集合的笛卡尔积。
select * from TableA cross join TableB;

介绍完join的用法后,我们主要说一下多表关联:(以left join举例)
一般情况下,多表关联(三表或三表以上的)我们都是通过建立中间表的操作,主表一般为中间表
例如:
select * from A a left join B b on a.连接属性 = b.连接属性 left join C c on c.连接属性 = a.连接属性
比如说学生选课,多个学生可以选一门课,一个学生也能选多门课,这时候是多对多的关系,我们一般会建立三个表,学生表、课程表、选课表(即中间表,存储学生和课程的关系)

还有一种情况就是直接建立联系,即A连B,B连C,而不是通过A表作为中间表(A连B,A连C),这种方式的时候就会有多种情况:
第一种:A与B,B与C均是一对一的关系
结果:数据一般情况下都是正确的(不管B、C数据行数多少,最后最大行数都是以A与B连接后的行数)
第二种:A与B是一对一的关系,B与C是一对多的关系
结果:A表的数据是有重复的(最后的行数是A与B连接后再与C连接后的行数,A是会重复使用)
第三种:A与B是一对多的关系,B与C是一对一的关系
结果:数据行数是A与B连接后的行数
第四种:A与B是多对一的关系,B与C是一对一的关系
结果:数据行数是A与B连接的行数
第五种:A与B是多对一的关系,B与C是一对多的关系
结果:与第二种情况类似,A表数据也会重复使用
第六种:A与B是多对一的关系 ,B与C是多对一的关系
结果:数据行数是A与B连接后的行数
第七种(A与B多对多):B与C是一对多或多对多时,数据A与B连接后的数据都会被重复利用

总结:若是中间表作为连接表,与后面连接的表关系一对多,或者多对多都会导致前面的连接好的表数据重复