用實驗方法加深理解Oracle的外連線(left/right/full)和內連線(inner)

urgel_babay發表於2016-02-29
總是對Oracle的左連線、右連線以及(+)對應的外連線型別糊塗,透過實驗加深對連線型別語法的理解。外連線分為三種:
1. 左外連線,對應SQL關鍵字:LEFT (OUTER) JOIN
2. 右外連線,對應SQL關鍵字:RIGHT (OUTER) JOIN
3. 全外連線,對應SQL關鍵字:FULL (OUTER) JOIN
左右外連線都是以一張表為基表,在顯示基表所有記錄外,加上另外一張表中匹配的記錄。如果基表的資料在另一張表中沒有記錄,那麼相關聯的結果集行中顯示為空值。
精確點說,引用MOS:
對於左連線,將會返回join連線條件中第一次提到的表(或者”左邊“的表)。
對於右連線,將會返回join連線條件中第二次提到的表(或者”右邊“的表)。

實驗:
1. 準備
SQL> create table left_tbl(id number);
Table created.

SQL> create table right_tbl(id number);
Table created.

insert into left_tbl values(1); 
insert into left_tbl values(2);
insert into left_tbl values(3);

insert into right_tbl values(2);
insert into right_tbl values(3);
insert into right_tbl values(6);

SQL> select * from left_tbl;
        ID
----------
         1
         2
         3

SQL> select * from right_tbl;
        ID
----------
         2
         3
         6

2. 左連線
SQL> select * from left_tbl l left join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
從排序看,左右表匹配的記錄排在前面,並且是升序
也可以這樣寫:select * from left_tbl l left join right_tbl r on l.id = r.id(+);

SQL> select * from left_tbl l, right_tbl r where l.id = r.id(+);
        ID         ID
---------- ----------
         2          2
         3          3
         1
使用(+),放右表表示左表所有記錄,再加上右表的記錄

SQL> select * from left_tbl l, right_tbl r where r.id(+) = l.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
將where條件中左右表互換,結果還是左連線,因為(+)在左邊,表示加上right表的記錄

SQL> select * from left_tbl left join right_tbl using (id);
        ID
----------
         2
         3
         1
此處使用using,只顯示了左表的記錄

3. 右連線
SQL> select * from left_tbl l right join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
                    6
和左右連線相同,左右表匹配的記錄排在前面,並且是升序
也可以這樣寫:select * from left_tbl l right join right_tbl r on l.id(+) = r.id;

SQL> select * from left_tbl l, right_tbl r where l.id(+) = r.id;

        ID         ID
---------- ----------
         2          2
         3          3
                    6
使用(+),放左表表示右表所有記錄,再加上左表的記錄

SQL> select * from left_tbl l, right_tbl r where r.id = l.id(+);

        ID         ID
---------- ----------
         2          2
         3          3
                    6
將where條件中左右表互換,結果還是右連線,因為(+)在右邊,表示加上left表的記錄

4. 全外連線
SQL> select * from left_tbl l full join right_tbl r on l.id = r.id;或select * from left_tbl l full outer join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
                    6
會顯示左右表的記錄,不匹配的用NULL

5. 內連線
說了外連線,再看下內連線,innser join或join。
SQL> select * from left_tbl l inner join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
用inner join只顯示左右表都匹配的記錄

SQL> select * from left_tbl l join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
直接用join和inner join相同

SQL> select * from left_tbl l, right_tbl r where l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
用=代替on是內連線另外一種用法

總結:
1. (+)在哪個表的旁邊,就表示基表是另外一張表,結果集還需要加上(+)表中不匹配的資料。
2. 內連線inner關鍵字可省,外連線outer關鍵字可省。
3. 用on和where =都可以使用(+)方式。

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

相關文章