還是假設有兩個表:
人員表:
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 總部