數據庫表的鏈接有:數據庫
1.內鏈接(天然鏈接):只有兩個表相匹配的行才能在結果集中顯示出來express
2.外鏈接,包括三種:spa
2-1 左外鏈接(左表是基表,右表是匹配表,左表所有顯示,右表只顯示匹配的記錄)orm
2-2 右外鏈接(右表是基表,左表是匹配表,右表所有顯示,左表只顯示匹配的記錄)it
2-3 全外鏈接(左右兩表全部的記錄都顯示出來)io
3.自鏈接(鏈接發生在一張基表內)table
inner join 表示內鏈接;left join表示左外鏈接;right join表示右外鏈接;full join表示徹底外鏈接。on 子句用於指定鏈接條件。基礎
注意:若是使用from子句指定內、外鏈接,則必須使用on子句指定鏈接條件;若是使用(+)操做符指定外鏈接,則必須使用where子句指定鏈接條件。select
若是主表的 主鍵列 和從表的 外部鍵列 名稱相同,那麼可使用 natural join 關鍵字自動執行內鏈接操做
搜索
select id,name from table1 natural join table2;
舉例子
create table1(a int,b int);
create table2(a int,b int);
內鏈接 select * from table1 a,table2 b where a.a=b.a;
左鏈接 select * from table1 a,table2 b where a.a=b.a(+);
右鏈接 select * from table1 a,table2 b where a.a(+)=b.a;
徹底鏈接 select * from table1 a,table2 b where a.a=b.a(+)
union
select * from table1 a,table2 b where a.a(+)=b.a;
笛卡爾積 select * from table1,table2;
若是a表有5行,b表有10行,則笛卡爾積以後一共有5*10=50行。
Oracle外鏈接
(1)左外鏈接(左邊的表不加限制)
(2)右外鏈接(右邊的表不加限制)
(3)全外鏈接(左右兩邊的表都不加限制)
外鏈接(Outer Join)
外鏈接會返回每一個知足第一個(頂端)輸入與第二個(底端)輸入的鏈接的行。它還會返回 任何在第二個輸入中沒有匹配行的第一個輸入中的行。外鏈接有三種:左外鏈接、右外鏈接、全外鏈接,對應的SQL語句是LEFT/RIGHT/FULL OUTER JOIN。一般咱們省略outer這個關鍵字,寫成:LEFT/RIGHT/FULL JOIN.
在左外鏈接和右外鏈接的時候都會以一張表做爲基表,該表的內容會所有顯示,而後在加上兩張表匹配的內容。若是基表的數據在另外一張表中沒有記錄,那麼在相關聯的結果集行中列顯示爲空值。
對於外鏈接,也可使用(+)來表示,使用(+)號時要注意一些事項:
1>(+)號操做符只能出如今where子句中,而且不能和outer join語法同時使用。
2>當使用(+)操做符執行外鏈接時,若是在where子句中包含多個條件,則必須全部的條件都包含(+)操做符。
3>(+)操做符只適用於列,不能用在表達式上。
4>(+)操做符不能與or和in操做符一塊兒使用.
5>(+)操做符只能用於實現左外鏈接和右外鏈接,不能用於實現徹底外鏈接。
舉例子:
這裏有兩張表:dava表(左表)和bi表(右表)
select * from bi;
ID NAME
1 dave
2 bi
3 big bird
4 exc
9 懷寧
select * from dave
ID NAME
8 安慶
1 dava
2 bl
1 bl
2 dava
3 dba
4 sf
5 dmm
1.左外鏈接( left join)
left join是以左邊表的記錄爲基礎,它的結果集是dave表中的數據,再加上dave表和bi表匹配的數據。話句話說,左表(dave)的記錄會所有顯示出來,而右表(bl)只會顯示出符合搜索條件的記錄,bi表記錄不足的地方均爲null。
寫法示例:select * from dave a left join bi 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 4 exc
5 dmm --此處B表爲null,沒有匹配到
8 安慶 --此處B表爲null,沒有匹配到
寫法示例: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 4 exc
5 dmm
8 安慶
用(+)來實現,+號表示補充,即哪一個表有+號,這個表就是匹配表。所以,加號寫在右表,則右表是匹配表,左表是基表,左表所有顯示,便是左鏈接。
寫法示例: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 4 exc
5 dmm
8 安慶
2.右外鏈接
右外鏈接是以右表(bl)爲基礎,所以,會顯示bl表的全部記錄,再加上dave和bl匹配的結果,dave表不足的地方使用null填充。
寫法示例: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 填充
(+)的寫法示例:select * from dave a,bi 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 懷寧
3.全外鏈接
左表的右表都不作限制,全部的記錄都顯示,兩表不足的地方用null表示。全外鏈接不支持(+)這種寫法。
寫法示例: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 4 exc
5 dmm
9 懷寧