Oracle 錶鏈接方式(內鏈接/外鏈接/自鏈接) 詳解

Oracle 表之間的鏈接分爲三種:express

1. 內鏈接(天然鏈接)網絡

2. 外鏈接oracle

1左外鏈接 (左邊的表不加限制)
       (2)右外鏈接(右邊的表不加限制)
        (3)全外鏈接(左右兩表都不加限制)測試

3. 自鏈接(同一張表內的鏈接)spa

 

SQL標準語法:
select table1.column,table2.column
from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;.net

inner join 表示內鏈接;視頻

left join表示左外鏈接;blog

right join表示右外鏈接;資源

full join表示徹底外鏈接;
on子句 用於指定鏈接條件。io

注意:

若是使用from子句指定內、外鏈接,則必需要使用on子句指定鏈接條件
       若是使用(+)操做符指定外鏈接,則必須使用where子句指定鏈接條件

 

 

 

 

一. 內鏈接(Inner Join/Join

 

 

1.1  Inner Join 

Inner join邏輯運算符返回知足第一個(頂端)輸入與第二個(底端)輸入聯接的每一行。這個和用select查詢多表是同樣的效果,因此內鏈接不多

還有一點要說明的就是Join 默認就是inner join。 因此咱們在寫內鏈接的時候能夠省略inner 這個關鍵字。 

 

 

1.2 下面舉例來講明內鏈接:

1.2.1 先建立2張測試表並插入數據:

SQL> select * from dave;

ID  NAME

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

1  dave

2  bl

1  bl

2  dave

SQL> select * from bl;

ID  NAME

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

1  dave

2  bl

1.2.3 用內連接進行查詢:

SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;   -- 標準寫法

        ID NAME       NAME

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

         1 dave       dave

         2 bl         bl

         1 bl         dave

         2 dave       bl

SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id;  -- 這裏省略了inner 關鍵字

        ID NAME       NAME

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

         1 dave       dave

         2 bl         bl

         1 bl         dave

         2 dave       bl

SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id;  -- select 多表查詢

        ID NAME       NAME

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

         1 dave       dave

         2 bl         bl

         1 bl         dave

         2 dave       bl

   從這三個SQL 的結果咱們也能夠看出,他們的做用是同樣的。

 

 

1.3 天然鏈接(Natural join)

天然鏈接是在兩張表中尋找那些數據類型和列名都相同的字段,而後自動地將他們鏈接起來,並返回全部符合條件按的結果。

看一下天然鏈接的例子:

SQL> Select id,name from dave a natural join bl b;  

        ID NAME

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

         1 dave

         2 bl

這裏咱們並無指定鏈接的條件,實際上oracle爲咱們自做主張的將,dave中的idname字段與bl中的idname字段進行了鏈接。也就是實際上至關於

SQL> Select dave.id,bl.name From dave join bl on dave.id = bl.id and dave.name=bl.name;

        ID NAME

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

         1 dave

         2 bl

所以,咱們也能夠將天然鏈接理解爲內鏈接的一種。 

 

 

有關天然鏈接的一些注意事項

1.若是作天然鏈接的兩個表的有多個字段都知足有相同名稱個類型,那麼他們會被做爲天然鏈接的條件。

2.若是天然鏈接的兩個表僅是字段名稱相同,但數據類型不一樣,那麼將會返回一個錯誤。

 

 

 

 

二. 外鏈接(Outer Join)

outer join則會返回每一個知足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外鏈接分爲三種: 左外鏈接,右外鏈接,全外鏈接。 對應SQLLEFT/RIGHT/FULL OUTER JOIN 一般咱們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN

在左外鏈接和右外鏈接時都會以一張表爲基表,該表的內容會所有顯示,而後加上兩張表匹配的內容。 若是基表的數據在另外一張表沒有記錄。 那麼在相關聯的結果集行中列顯示爲空值(NULL)。 

 

 

對於外鏈接 可使用「(+) 」來表示 關於使用(+)的一些注意事項:
1.+)操做符只能出如今where子句中,而且不能與outer join語法同時使用。
2. 當使用(+)操做符執行外鏈接時,若是在where子句中包含有多個條件,則必須在全部條件中都包含(+)操做符
3.+)操做符只適用於列,而不能用在表達式上。
4.+)操做符不能與orin操做符一塊兒使用。
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表的因此記錄,在加上DaveBL 匹配的結果。 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

                               9 懷寧

已選擇9行。

 

三. 自鏈接

自鏈接(self join)是SQL語句中常常要用的鏈接方式,使用自鏈接能夠將自身表的一個鏡像看成另外一個表來對待,從而可以獲得一些特殊的數據。

示例:

oraclescottschema中有一個表是empemp中的每個員工都有本身的mgr(經理),而且每個經理自身也是公司的員工,自身也有本身的經理。

下面咱們須要將每個員工本身的名字和經理的名字都找出來。這時候咱們該怎麼作呢?

若是咱們有兩張這樣的表分別教workermgr,那麼咱們就很好寫SQL語句。

Select worker.name,

Mgr.name

From worker,mgr

Where worker.id = mgr.id;

 

但如今咱們只有一張emp表。因此咱們能夠採用自鏈接。自鏈接的本意就是將一張表當作多張表來作鏈接。咱們能夠這樣來寫SQL語句:

SQL> select work.ename worker,mgr.ename  manager from scott.emp work, scott.emp mgr

  2  where work.mgr = mgr.empno

  3  order by work.ename;

WORKER     MANAGER

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

ADAMS      SCOTT

ALLEN      BLAKE

BLAKE      KING

CLARK      KING

FORD       JONES

JAMES      BLAKE

JONES      KING

MARTIN     BLAKE

MILLER     CLARK

SCOTT      JONES

SMITH      FORD

WORKER     MANAGER

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

TURNER     BLAKE

WARD       BLAKE

已選擇13行。

 

 

各類鏈接的一個圖示:

 

 

 

 

 

整理自網絡

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

QQ: 492913789
Email: ahdba@qq.com
Blog: http://www.cndba.cn/dave

網上資源: http://tianlesoftware.download.csdn.net 

相關視頻:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 

DBA1 羣:62697716(滿); DBA2 羣:62697977(滿)

DBA3 羣:63306533;     聊天 羣:40132017