oracle+表自身关联,6-oracle_表关联

表关联是对2个表的列合并,怎么合并呢,这里需要一个连接信息,也就是关联字段,比如一个学生表里有学号+班级+出生日期,另一个表里有学号+科目+成绩,哪如果需要得到学号+班级+科目+成绩这样的信息,这就需要表关联,关联的字段用什么呢,只能用这2个表共同相关的字段,也就是学号这个字段,这样就能把2个表连接起来。哪分别有哪几种关联类型呢?

有如下数据:

2cb48c4672f88684185684d1e205d438.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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;

ec4bfde548d038816696ec86a0abf8c5.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2)左关联:left join

比如需求是:得到所有学生的成绩的信息,格式是:学号+班级+科目+成绩,如果某个学生没有成绩也需要显示学生的信息,成绩相关信息的默认为空。

ec4bfde548d038816696ec86a0abf8c5.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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;

ce8fe4cd1a1fc1a765cce1cfa0d26897.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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;

2b9fa2cc8cccffbee9c3fe72d94d4265.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

各关联条件的效果图:

d974f4a2a5c4dd3de8faa32231a4df75.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

注意事项:

如果我们在学生信息表里增加一条相同的学号为2的信息,哪么会有什么情况的变化。

数据如下:

f85fad944aa5bf97d1503db07eb26353.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

内关联:

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;

431d73732a91f8cd31a14be115cd76de.png

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

你会发现学号为2的有两个相同的数学成绩,这就是笛卡尔积了,因为在做关联的时候,先读学生表的记录,拿到学号后,再去成绩表中找相同学号的数据,所以在读学生表的时候就读到了2条,然后找到1条成绩信息,2*1=2就得到了2条数据。

大家可以扩展想下,如果在成绩表中也增加1条学号为2的成绩数据,此时的结果又会是什么样呢,大家自己实验下。

更多技术文章请关注公众号:BLT328

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值