Oracle 資料庫的內外串連區別及外串連詳解

來源:互聯網
上載者:User

標籤:

內串連(inner join):返回2個表中完全合格記錄,結果集中每個表的欄位內容均來自各自的表;
外串連(outer join):返回2個表中完全合格記錄,再加上2個表中各自的記錄,結果集中的欄位只有一個表中有記錄時,另一個表中的欄位均使用空值null填寫。

Oracle  外串連

(1)左外串連 (左邊的表不加限制)
       (2)右外串連(右邊的表不加限制)
       (3)全外串連(左右兩表都不加限制)

 

     外串連(Outer Join)

outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯結的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外串連分為三種: 左外串連,右外串連,全外串連。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。

 

在左外串連和右外串連時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的資料在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空白值(NULL)。

 

對於外串連, 也可以使用“(+) ”來表示。 關於使用(+)的一些注意事項:
       1.(+)操作符只能出現在where子句中,並且不能與outer join文法同時使用。
       2. 當使用(+)操作符執行外串連時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
       3.(+)操作符只適用於列,而不能用在運算式上。
       4.(+)操作符不能與or和in操作符一起使用。
       5.(+)操作符只能用於實現左外串連和右外串連,而不能用於實現完全外串連。

 


在做實驗之前,我們先將dave表和bl裡加一些不同的資料。 以方便測試。

SQL> select * from bl;

        ID NAME

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

         1 dave

         2 bl

         3 big bird

         4 exc

         9 懷寧

SQL> select * from dave;

        ID NAME

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

         8 安慶

         1 dave

         2 bl

         1 bl

         2 dave

         3 dba

         4 sf-express

         5 dmm

2.1 左外串連(Left outer join/ left join)

     left join是以左表的記錄為基礎的,樣本中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的資料,在加上Dave表和BL表匹配的資料。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜尋條件的記錄。BL表記錄不足的地方均為NULL.

 

樣本:

SQL> select * from dave a left join bl b on a.id = b.id;

 

       ID NAME               ID NAME

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

        1 bl                  1 dave

        1 dave                1 dave

        2 dave                2 bl

        2 bl                  2 bl

        3 dba                 3 big bird

        4 sf-express          4 exc

        5 dmm                             -- 此處B表為null,因為沒有匹配到

        8 安慶                             -- 此處B表為null,因為沒有匹配到

SQL> select * from dave a left outer join bl b on a.id = b.id;

 

        ID NAME               ID NAME

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

         1 bl                  1 dave

         1 dave                1 dave

         2 dave                2 bl

         2 bl                  2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

         5 dmm

         8 安慶

 

用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左串連。

 

SQL> Select * from dave a,bl b where a.id=b.id(+);    -- 注意: 用(+) 就要用關鍵字where

 

        ID NAME               ID NAME

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

         1 bl                  1 dave

         1 dave                1 dave

         2 dave                2 bl

         2 bl                  2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

         5 dmm

         8 安慶

    

2.2 右外串連(right outer join/ right join)

和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.

 

樣本:

SQL> select * from dave a right join bl b on a.id = b.id;

 

        ID NAME               ID NAME

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

         1 dave                1 dave

         2 bl                  2 bl

         1 bl                  1 dave

         2 dave                2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

                               9 懷寧    --此處左表不足用Null 填充

已選擇7行。

SQL> select * from dave a right outer join bl b on a.id = b.id;

        ID NAME               ID NAME

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

         1 dave                1 dave

         2 bl                  2 bl

         1 bl                  1 dave

         2 dave                2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

                               9 懷寧  --此處左表不足用Null 填充

已選擇7行。

 

 

用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右串連。

 

SQL> Select * from dave a,bl b where a.id(+)=b.id;

 

        ID NAME               ID NAME

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

         1 dave                1 dave

         2 bl                  2 bl

         1 bl                  1 dave

         2 dave                2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

                               9 懷寧

 

2.3 全外串連(full outer join/ full join)

     左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外串連不支援(+)這種寫法。

 

樣本:

 

SQL> select * from dave a full join bl b on a.id = b.id;

        ID NAME               ID NAME

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

         8 安慶

         1 dave                1 dave

         2 bl                  2 bl

         1 bl                  1 dave

         2 dave                2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

         5 dmm

                               9 懷寧

 

已選擇9行。

 

SQL> select * from dave a full outer join bl b on a.id = b.id;

        ID NAME               ID NAME

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

         8 安慶

         1 dave                1 dave

         2 bl                  2 bl

         1 bl                  1 dave

         2 dave                2 bl

         3 dba                 3 big bird

         4 sf-express          4 exc

         5 dmm      

Oracle 資料庫的內外串連區別及外串連詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.