用實驗方法加深理解Oracle的外連接(left/right/full)和內連接(inner)
總是對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 =都可以使用(+)方式。