Oracle数据库中多表查询外连接的见解

*. 我们可以通过这个例题彻底理解多表查询外连接的意思即(分清主表和副表,主表需要全部出来,而副表需要添加(+))。

 例题:查询emp 表中的数据并显示每个员工的上级 

1. 首先我们查询一下emp表中的数据

select * from emp;

查询出来的emp 表中的数据如下
在这里插入图片描述
2.我们要通过外连接来把员工的上级显示出来;

select users.ename || '的上级是' ||boss.ename
from emp users,emp boss
where users.mgr = boss.empno;

结果:我们可以看到这样写的结果是没有把King的上级显示出来,这是因为emp表中mgr这一列有个值为空,而empo这一列没有空的,那么我们这时肯定会认为users.mgr为副表,而boss.empo为主表在users.mgr后面加上(+)就可以了,我们看一下结果。
在这里插入图片描述
3.

select users.ename || '的上级是' ||boss.ename
from emp users,emp boss
where users.mgr(+) = boss.empno;

结果:我们发现这样写的结果还是不对的,证明users.mgr不是副表,而boss.empo应该为副表。
这是为什么呢?
在这里插入图片描述
4.我们先看一下正确的答案:

select users.ename || '的上级是' ||boss.ename
from emp users,emp boss
where users.mgr = boss.empno(+);

结果:
在这里插入图片描述
5.这到底是为什么呢,下面说一下我的见解。
(1)在emp表中我们要查询的是员工的上级,就是

users.ename || '的上级是' ||boss.ename

我们是通过员工的上级(mgr)与上级对应的编号(empno)来建立联系的。所以会有

users.mgr = boss.empno;

(2) 但是为什么是users.mgr = boss.empno(+);
而不是users.mgr(+) = boss.empno;
(3)我们可能直观的看到users的mgr有个值为空,而boss的empno没有空的,就认为左边的比右边的少了一个,所以左边的为副表,右边为主表所以就写出了
users.mgr(+) = boss.empno;
(4)其实不然,我们要查询显示出来的的不是users的mgr的内容而是users本身,而要查出来它本身,就要看它的empno,它的empno是完整的,同理我们查询的是boss的empno,而boss的empno是在mgr下的,它是少了一个的,所以右边的boss.empno这张表比左边的users.mgr表少了一个值,所以它为副表,左边的为主表。所以才是users.mgr = boss.empno(+);

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值