天天看點

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

繼續閱讀