6-oracle_表关联
表关联是对2个表的列合并,怎么合并呢,这里需要一个连接信息,也就是关联字段,比如一个学生表里有学号+班级+出生日期,另一个表里有学号+科目+成绩,哪如果需要得到学号+班级+科目+成绩这样的信息,这就需要表关联,关联的字段用什么呢,只能用这2个表共同相关的字段,也就是学号这个字段,这样就能把2个表连接起来。哪分别有哪几种关联类型呢?
有如下数据:
1)内关联:inner join
比如需求是:得到所有学生有成绩的信息,格式是:学号+班级+科目+成绩,哪么就需要用到inner join关联,要求是必须存在学生表中,并且也存在成绩表中的学号。
select a.stu_no, a.stu_cls, b.subject, b.score
from t_student a
inner join t_score b
on a.stu_no = b.stu_no;
2)左关联:left join
比如需求是:得到所有学生的成绩的信息,格式是:学号+班级+科目+成绩,如果某个学生没有成绩也需要显示学生的信息,成绩相关信息的默认为空。
3)右关联:right join(与left join相反,其实把A,B表互换下可以改写为left join)
select a.stu_no, a.stu_cls, b.subject, b.score
from t_student a
right join t_score b
on a.stu_no = b.stu_no;
等价于:
select b.stu_no, b.stu_cls, a.subject, a.score
from t_score a
left join t_student b
on a.stu_no = b.stu_no;
4)全关联:full join
比如需求是:得到所有学生的成绩的信息,格式是:学号+班级+科目+成绩,如果某个学生没有成绩也需要显示学生的信息,成绩相关信息的默认为空,如果有成绩信息,没有学生信息也要显示,学生相关信息默认为空
select a.stu_no, a.stu_cls, b.subject, b.score
from t_student a
full join t_score b
on a.stu_no = b.stu_no;
各关联条件的效果图:
注意事项:
如果我们在学生信息表里增加一条相同的学号为2的信息,哪么会有什么情况的变化。
数据如下:
内关联:
select a.stu_no, a.stu_cls, b.subject, b.score
from t_student a
inner join t_score b
on a.stu_no = b.stu_no;
你会发现学号为2的有两个相同的数学成绩,这就是笛卡尔积了,因为在做关联的时候,先读学生表的记录,拿到学号后,再去成绩表中找相同学号的数据,所以在读学生表的时候就读到了2条,然后找到1条成绩信息,2*1=2就得到了2条数据。
大家可以扩展想下,如果在成绩表中也增加1条学号为2的成绩数据,此时的结果又会是什么样呢,大家自己实验下。
更多技术文章请关注公众号:BLT328