8.多表查询-外连接

还是假设有两个表:
人员表:
empno ename deptno
1 Tom 10
2 Jarry 10
3 Pully 20
4 Hyman null
部门表:
deptno dname
10 研发
20 行政
30 总部

现在有个需求,要找到所有员工对应的工号/姓名/部门号以及部门名称,我们看员工表,此时存在一个不存在部门号的员工Hyman,此时要怎么把所有员工的信息找出来呢,如果我们单纯用内链接的形式:
select e.empno,e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
此时我们会发现,在员工表中的不存在部门号的员Hyman将不会被选择出来,因为他的deptno是null,而null是不参与比较的,所以Hyman被忽略。
那么怎么解决这个问题呢?这就引入了外连接的概念:
外连接的结果集=内连接的结果集+匹配不上的记录。
在oracle中使用(+) 来表示外连接,(+)在等号哪边,而另一边的所有数据就会被匹配出来,没有对应数据的用null补齐:

oracle外连接语法:

select e.empno,e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno(+);

结果是:
empno ename deptno dname
1          Tom      10          研发
2          Jarry    10          研发
3          Pully     20          行政
4          Hyman null         null


sql99中的语法:

sql99中包括左外/右外/全外连接三种情况:

左外:

select e.empno,e.ename,e.deptno,d.dname from emp e left outer join dept d on(e.deptno=d.deptno);
结果:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
4 Hyman null null

右外:

select e.empno,e.ename,e.deptno,d.dname from emp e right outer join dept d on(e.deptno=d.deptno);
结果:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
null null 30 总部

全外连接:

select e.empno,e.ename,e.deptno,d.dname from emp full outer join dept d on(e.deptno=d.deptno);
结果:

empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
4 Hyman null null
null null 30 总部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值