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

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

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

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

select * from emp;

查询出来的emp 表中的数据如下
Oracle数据库中多表查询外连接的见解_第1张图片
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后面加上(+)就可以了,我们看一下结果。
Oracle数据库中多表查询外连接的见解_第2张图片
3.

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

结果:我们发现这样写的结果还是不对的,证明users.mgr不是副表,而boss.empo应该为副表。
这是为什么呢?
Oracle数据库中多表查询外连接的见解_第3张图片
4.我们先看一下正确的答案:

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

结果:
Oracle数据库中多表查询外连接的见解_第4张图片
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(+);

你可能感兴趣的:(Oracle数据库,数据库)