資料庫中的資料不可能都放在同一張表中,這樣效率是很低下的,所以都是分表儲存。
但是我們往往需要獲取的資料並不會都集中在一張表中,而是多張表都會涉及到,那怎麼從多張表中獲取到我們的資料?
這個時候就會用到多表連線 ----------》 在多個表之間通過一定的連線條件,使表之間 發生關聯,進而能從多個表之間獲取資料。
連線就是從笛卡爾積選取屬性間滿足一定條件的元組。
而連線又分為很多種連線:
如下兩張表r和s
表r:abc
a1b15a1
b26b18b38b1
b412
表s:se
b13b27
b310b32
b52等值連線:where r.b = s.b 含義:從rs兩張表的笛卡爾結果集中選取r.b=s.b的結果集 結果如下:
ar.b
cs.bea1
b15b13
a1b26b2
7a2b38
b310
a2b38b3
2假如不想兩個b列(r.b和s.b)同時出現,可以用等值連線中的特殊連線--》自然連線,連線結果會自動去除重複列ab
cea1b153
a1b267
a2b3810
a2b382
非等值連線:where c < e(不一定要《號,可以使用between... and....語句之類) 含義:在笛卡爾積結果集中選取r表中c列數值大於e列數值的結果集 結果如下:
ar.b
cs.bea1
b15b27
a1b15b3
10a1b26
b27a1b26b3
10a2b38
b310
②根據連線結果是否返回某些列為空值的元組分為左外連線和右外連線
在連線查詢中如果某些元組存在屬性值為空時,在操作時這些元組就會被捨棄。
如下:假如r、s表都有列值為空的元組,當等值連線查詢時,會查到一下結果,但是因為存在空值而被捨棄了,最後輸出上述等值連線結果ab
cea1b153
a1b267
a2b3810
a2b382
a2b4
12null
null
b5null
2那想要在連線時輸出這些存在空值的元組有什麼辦法?
①左外連線:就是只保留左邊關係的懸浮元組(dangling tuple),而右邊的元組屬性為空值null
在oracle中使用外部連線符號 (+)表示那一邊取空值null:
取左外連線就是where語句為where r.b = s.b(+) , 結果如下:ab
cea1b153
a1b267
a2b3810
a2b382
a2b4
12null
①右外連線:就是只保留右邊關係的懸浮元組(dangling tuple),而左邊的元組屬性為空值null
取左外連線就是where語句為where r.b(+) = s.b, 結果如下:ab
cea1b153
a1b267
a2b3810
a2b382
null
b5null2
以上的(非)等值連線或者外部連線只講到兩張表的連線,假如需要超過兩張表的連線的話,就使用and連線兩個連線語句
如:where table1.name = table2.name and table2.name = table3.name ;
還有有時需要自生連線的情況下可以使用別名實現。
如:select one.a , two.b from r one ,r two where one.a = two.a;
Oracle之多表查詢
多表查詢的基礎語法 select 查詢列 1 別名1,查詢列 2 別名2,from 表名稱1 別名1 名稱2 別名2 給出幾個例子吧。1.select e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.grade from emp e,dept d,sal...
Oracle篇 之 多表查詢
一 概念 從多個表中查詢資料時,需要在表和表間建立連線,一般使用主外來鍵建立連線 二 連線種類 1 等連線 連線條件使用等號 非等連線 連線條件使用等號以外的其它符號 2 內連線 根據指定的連線條件進行連線查詢,滿足連線條件的資料才會出現在結果集 最常見的等值連線 外連線 在內連線的基礎上,將某個連...
Oracle 多表連線
oracle 多表連線 oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一...