还是假设有两个表:
人员表:
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补齐:
结果是:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
4 Hyman null null
结果:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
4 Hyman null null
结果:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
null null 30 总部
结果:
empno ename deptno dname
1 Tom 10 研发
2 Jarry 10 研发
3 Pully 20 行政
4 Hyman null null
null null 30 总部
人员表:
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 总部