轉(zhuǎn)載:http://blog.chinaunix.net/uid-21187846-id-3288525.html
Oracle 外連接
(1)左外連接 (左邊的表不加限制)(左表為基表)
(2)右外連接(右邊的表不加限制)(右邊表為基表)
(3)全外連接(左右兩表都不加限制)(兩張表均為基表)
外連接(Outer Join)
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯(lián)接的行劈猿。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行行剂。外連接分為三種: 左外連接,右外連接类咧,全外連接。 對應(yīng)SQL:LEFT/RIGHT/FULL OUTER JOIN滔以。 通常我們省略outer 這個關(guān)鍵字劳曹。 寫成:LEFT/RIGHT/FULL JOIN。
在左外連接和右外連接時都會以一張表為基表欠气,該表的內(nèi)容會全部顯示,然后加上兩張表匹配的內(nèi)容镜撩。 如果基表的數(shù)據(jù)在另一張表沒有記錄预柒。 那么在相關(guān)聯(lián)的結(jié)果集行中列顯示為空值(NULL)。
對于外連接袁梗, 也可以使用“(+) ”來表示宜鸯。 關(guān)于使用(+)的一些注意事項:
1.(+)操作符只能出現(xiàn)在where子句中,并且不能與outer join語法同時使用遮怜。
2. 當使用(+)操作符執(zhí)行外連接時顾翼,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用于列奈泪,而不能用在表達式上。
4.(+)操作符不能與or和in操作符一起使用灸芳。
5.(+)操作符只能用于實現(xiàn)左外連接和右外連接涝桅,而不能用于實現(xiàn)完全外連接。
在做實驗之前烙样,我們先將dave表和bl里加一些不同的數(shù)據(jù)冯遂。 以方便測試。
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是以左表的記錄為基礎(chǔ)的,示例中Dave可以看成左表,BL可以看成右表,它的結(jié)果集是Dave表中的數(shù)據(jù)谒获,在加上Dave表和BL表匹配的數(shù)據(jù)蛤肌。換句話說,左表(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 安慶
用(+)來實現(xiàn)展东, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號炒俱,這個表就是匹配表盐肃。所以加號寫在右表,左表就是全部顯示权悟,故是左連接砸王。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關(guān)鍵字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的結(jié)果剛好相反,是以右表(BL)為基礎(chǔ)的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結(jié)果峦阁。 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行。
用(+)來實現(xiàn)榔昔, 這個+號可以這樣來理解: + 表示補充驹闰,即哪個表有加號,這個表就是匹配表件豌。所以加號寫在左表疮方,右表就是全部顯示,故是右連接茧彤。
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