Oracle连接总结

在实际操作中,一次数据库查询往往会涉及 多个表。单单查找一个表中的数据意义不大。比如要查一个学生选了哪些课程,肯定就涉及到两个表,一个学生表,一个选课表。那么这两个表怎么放到一起来操作呢,这就需要用到连接( join), 连接是数据库操作中将多个表连接成一个表的重要手段。(而连接条件就是通过主外键来操作)
如果说,一个连接查询操作中,没有加where子句,那么就会通过交叉连接将两张表中的数据全部查出来,这种情况叫做 笛卡尔积。假设A表有2条数据,B表有三条数据,那么笛卡尔积会产生2*3=6条数据。举个数学例子: 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。这样应该通俗点吧。
student表中数据如下(本文都会以这两个表的数据进行演示!!)

teacher表中数据如下

执行下列查询语句会产生笛卡尔积
select * from student,teacher
结果是:

实际应用中,笛卡尔积没啥意义。我们往往只需要查到对自己有用的数据,应该在两个表连接时加上连接条件(where条件子句),所以在Oracle操作中就要用到连接。
连接分为:内连接和外连接
若连接的结果集中只保留了符合连接条件的元组,而排除了两个表中没有对应的或匹配的元组情况,这种连接称为 内连接。在内连接的查询结果中,会丢失一部分信息。
内连接:分为等值连接,不等值连接,自连接
等值连接:可以理解为用等号建立起来的连接
例如:
select * from student s,teacher t where s.tid = t.id
执行结果:

看,加上条件语句之后就没有出现笛卡尔积了,这里的条件是:学生表中的tid的值必须等于教师表中的id值,符合条件才能查出来。
不等值连接:就是不通过等号(除了等号之外的比如:> , >= , != , < , <=)来建立连接的查询
例如:
select * from student s,teacher t where s.tid >= t.id
执行结果:

这里的条件是:学生表中的tid值大于等于教师表的id值
自连接:自连接是对同一个表进行的连接。要自行一个自连接,必须使用不同的表别名来标识在查询中每次对表的引用。
例如有如下表:

这张表是一张员工表,想想就知道,员工表中肯定有普通员工,也有领导,并且领导也可能有自己的上司。
现在要查出自己以及自己直属上司(有上司的情况下)的名字,就可以用到如下sql语句:
select e1.name , e2.name from employee e1 ,employee e2 where e1.manage_id = e2.id
执行结果:

如果要求查询结果集中保留非匹配的元组,则为外连接,外连接可以解决内连接数据信息丢失的情况。
外连接:分为左外连接,右外连接,全外连接
为了更加直观的观看结果,现改变student表中的数据如下:
insert into student(id,name) values (4,s4)
insert into student(id,name) values (5,s5)

改变teacher表数据如下:
insert into teacher values(3,t3)

左外连接返回包括左表中的所有记录和右表中联结字段相等的记录,(left join 或者 left outer join,也可在等值连接的等号右边字段加上加号)
例如:
select * from student s LEFT JOIN teacher t ON s.tid = t.id 
或者:
select * from student s LEFT Outer JOIN teacher t ON s.tid = t.id 
或者:
select * from student s ,teacher t where s.tid = t.id(+) 
执行结果:

加号加在那边,可以俗气的理解,左外连接,左外,那我的加号就放在左外咯,那就放在右边。左外连接会查询出左边的所有记录,然后会查出跟它匹配的右边记录
右外连接:和左外连接相反,会返回右表中所有记录和左表中连接字段相等的记录,(right join 或者right outer join,也可在等值连接的等号左边字段加上加号)
例如:
select * from student s RIGHT JOIN teacher t ON s.tid = t.id 
或者:
select * from student s RIGHT OUTER JOIN teacher t ON s.tid = t.id 
或者:
select * from student s ,teacher t where s.tid(+)  = t.id
执行结果:

全外连接:相当于结合了左外连接和右外连接,它既查找了左边所有记录以及他所匹配的右边记录,又查找了右边所有记录以及它所匹配的左边记录(full join 或者 full outer join)
例如:
select * from student s full join teacher t ON s.tid = t.id
或者:
select * from student s full outer join teacher t ON s.tid = t.id
执行结果:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值