天天看点

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 总部

继续阅读