內鏈接(inner join):返回2個表中徹底符合條件的記錄,結果集中每一個表的字段內容均來自各自的表;
外鏈接(outer join):返回2個表中徹底符合條件的記錄,再加上2個表中各自的記錄,結果集中的字段只有一個表中有記錄時,另外一個表中的字段均使用空值null填寫。express
Oracle 外鏈接測試
(1)左外鏈接 (左邊的表不加限制)
(2)右外鏈接(右邊的表不加限制)
(3)全外鏈接(左右兩表都不加限制)基礎
外鏈接(Outer Join)select
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里加一些不一樣的數據。 以方便測試。db
SQL> select * from bl;dba
ID NAMEjoin
---------- ----------
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