Oracle(+)連線與Join連線

realkid4發表於2011-07-25

 

一個開發組同事在對舊系統程式碼進行分析的時候,發現(+)連線語句。這裡想說說(+)連線和Join連線的使用。

 

 

(+)連線是Oracle一種特有的連線方法,和我們常見的Join系列連線同時使用。(+)連線是一種外連線方式,作為簡單連線的一種擴充型別。我們通常理解的連線,是隻將符合連線條件的資料集合返回來。而用外連線之後,可以連帶將特定資料表的不符合條件行一併返回。

 

 

Join系列連線的特點是有專門的連線物件和被連線物件,使用on設定專門的連線條件。而(+)連線的連線條件是放置在where條件列表中的。下面我們透過一些實驗,來展示兩者的差異和特徵。

 

1、 環境準備

 

我們模擬一個簡單的實驗環境。

 

 

SQL> select * from dept;

 

    DEPTNO DEPTNAME

---------- ----------

         1 dept1

         2 dept2

         3 dept3

 

SQL> select * from emp;

 

     EMPNO EMPNAME                  DEPTNO

---------- -------------------- ----------

         1 emp1                          1

         2 emp2                          1

         3 emp3                          2

         4 emp4                          4

 

 

兩個資料表是使用deptno進行連線,兩邊分別存在不匹配的內容。如果我們使用最常見的連線方式,結果明顯是嚴格的連線匹配。

 

 

SQL> select * from dept, emp where dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

 

 

 

2(+)連線實驗

 

(+)連線語句是加入在where條件後的部分,作為查詢條件的一部分。

 

 

SQL> select * from dept, emp where dept.deptno(+)=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               2 emp2                          1

         1 dept1               1 emp1                          1

         2 dept2               3 emp3                          2

                               4 emp4                          4

 

 

 

SQL> select * from dept, emp where dept.deptno=emp.deptno(+);

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

         3 dept3                                     

 

 

兩個例子可以告訴我們(+)使用的特點,(+)連線的結果是將(+)號對面的資料表不符合記錄的結果也輸出出來。

 

(+)連線實質上是一種外連線Outer Join的現象,透過不同的位置來對應不同方向的結果。

 

3、 Join系列連線

 

我們經常使用的Join功能要強大的多,而且可讀性好一些。Join的特徵是將連線條件透過專門的on子句進行說明,而不是放置在where子句裡面。

 

ü        左連線Join

 

左連線left join是保證from子句中的資料表全部顯示。

 

 

SQL> select * from dept

  2  left join emp

  3  on dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

         3 dept3                                     

 

 

 

ü        右連線Join

 

右連線right join是保證Join的資料表全部顯示。對該子句筆者認為可以變通為left join,這樣似乎更容易看懂。

 

 

SQL> select * from dept

  2  right join emp

  3  on dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               2 emp2                          1

         1 dept1               1 emp1                          1

         2 dept2               3 emp3                          2

                               4 emp4                          4

 

 

 

ü        全連線full join

 

全連線是將兩個資料表中符合連線條件或者不符合連線條件的全部列出。注意:不符合連線條件的結果是不會進行連結的。

 

 

SQL> select * from dept

  2  full join emp

  3  on dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

                               4 emp4                          4

         3 dept3                                     

 

 

 

ü        內連線inner join

 

內連線就類似與我們傳統where的連線方式了,返回嚴格符合條件的資料列。

 

 

SQL> select * from dept

  2  inner join emp

  3  on dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

 

 

ü        笛卡爾積連線Cross Join

 

Cross Join是進行全匹配,兩兩之間進行笛卡爾積運算。

 

 

SQL> select * from dept

  2  cross join emp

  3  ;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         1 dept1               3 emp3                          2

         1 dept1               4 emp4                          4

         2 dept2               1 emp1                          1

         2 dept2               2 emp2                          1

         2 dept2               3 emp3                          2

         2 dept2               4 emp4                          4

         3 dept3               1 emp1                          1

         3 dept3               2 emp2                          1

         3 dept3               3 emp3                          2

         3 dept3               4 emp4                          4

 

12 rows selected

 

SQL> select * from dept

  2  cross join emp

  3  where dept.deptno=emp.deptno;

 

    DEPTNO DEPTNAME        EMPNO EMPNAME                  DEPTNO

---------- ---------- ---------- -------------------- ----------

         1 dept1               1 emp1                          1

         1 dept1               2 emp2                          1

         2 dept2               3 emp3                          2

 

 

 

4、 結論

 

(+)連線是Oracle中經常使用的一種連線方法語法,從簡單可讀的角度看,似乎要比Join系列要好一些。瞭解不同型別的Join特徵,才能更好的獲取到希望的資料,用好Oracle資料庫的強大功能。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-703074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章