條件連線(join)
t1inner[outer] } join t2
on boolean_expression
t1 [outer] } join t2
using ( join column list
)t1natural [outer] } join t2
和 outer
對所有連線(join) 型別都是可選的.inner
是預設; left
,right
,和 full
隱含外連線.
連線條件在on
或using
子句裡宣告, 或者用關鍵字natural
隱含地宣告.連線條件判斷來自兩個源表 中的那些行是"匹配"的,這些我們將在下面詳細解釋.
on子句是最常見的連線條件的型別∶它接收乙個和where
子句裡用的一樣的 布林值表示式.如果兩個分別來自t1
和t2的行在on
表示式上運算的 結果為真,那麼它們就算是匹配的行.
using
是縮寫的概念∶它接收乙個用逗號分隔的欄位名字列表, 這些字段必須是連線表共有的,最終形成乙個連線條件,表示 這些欄位對必須相同.最後,join using
的輸出會為每一對相等 的輸入字段輸出乙個字段,後面跟著來自各個表的所有其它字段. 因此,using (a, b, c)
等效於 on (t1.a = t2.a and t1.b = t2.b and t1.c = t2.c)
只不過是如果使用了on
,那麼在結果裡 a
,b,和 c
字段每個都會有兩個, 而用using
的時候每個欄位就只會有乙個.
最後,natural
是using
的縮寫形式∶它形成乙個 using
列表, 該列表由那些在兩個表裡都出現了的欄位名字組成.和using
一樣, 這些欄位只在輸出表裡出現一次.
條件join
的可能型別是∶
inner join
對於 t1 的每一行 r1,生成的連線表都有一行對應 t2 中的 每乙個滿足和 r1 的連線條件的行.
left outer join
首先,執行一次內連線.然後,為 t1 裡那些和 t2 裡任何一行都不滿足連線條件的行返回乙個連線行, 同時該連線行裡對應 t2 的列用空值補齊.因此, 生成的連線表裡無條件地包含來自 t1 裡的每一行至少 乙個副本.
right outer join
首先,執行一次內連線.然後,為 t2 裡那些和 t1 裡任何一行都不滿足連線條件的行返回乙個連線行, 同時該連線行裡對應 t1 的列用空值補齊.因此, 生成的連線表裡無條件地包含來自 t2 裡的每一行.
full outer join
首先,執行一次內連線.然後,為 t1 裡那些和 t2 裡任何一行都不滿足連線條件的行返回乙個連線行, 同時該連線行裡對應 t2 的列用空值補齊. 同樣,為 t2 裡那些和 t1 裡的任何行都不滿足連線條件的 行返回乙個連線行,該行裡對應 t1 的列用空值補齊.
如果 t1
和 t2
有乙個或者都是可以連線(join)的表, 那麼所有型別的連線都可以串在一起或巢狀在一起. 你可以在join
子句周圍使用圓括弧來控制連線順序, 如果沒有圓括弧,那麼join
子句是從左向右巢狀的.
為了解釋這些問題,假設我們有乙個表 t1
num | name和 t2-----+------
1 | a
2 | b
3 | c
num | value然後我們用不同的連線方式可以獲得各種結果:-----+-------
1 | ***
3 | yyy
5 | zzz
=>select * from t1 cross join t2;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
1 | a | 3 | yyy
1 | a | 5 | zzz
2 | b | 1 | ***
2 | b | 3 | yyy
2 | b | 5 | zzz
3 | c | 1 | ***
3 | c | 3 | yyy
3 | c | 5 | zzz
(9 rows)
=>
select * from t1 inner join t2 on t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
3 | c | 3 | yyy
(2 rows)
=>
select * from t1 inner join t2 using (num);
num | name | value
-----+------+-------
1 | a | ***
3 | c | yyy
(2 rows)
=>
select * from t1 natural inner join t2;
num | name | value
-----+------+-------
1 | a | ***
3 | c | yyy
(2 rows)
=>
select * from t1 left join t2 on t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
2 | b | |
3 | c | 3 | yyy
(3 rows)
=>
select * from t1 left join t2 using (num);
num | name | value
-----+------+-------
1 | a | ***
2 | b |
3 | c | yyy
(3 rows)
=>
select * from t1 right join t2 on t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
3 | c | 3 | yyy
| | 5 | zzz
(3 rows)
=>
select * from t1 full join t2 on t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
2 | b | |
3 | c | 3 | yyy
| | 5 | zzz
(4 rows)
用 on
=>select * from t1 left join t2 on t1.num = t2.num and t2.value = '***';
num | name | num | value
-----+------+-----+-------
1 | a | 1 | ***
2 | b | |
3 | c | |
(3 rows)
Join 連線查詢
在大多數實際開發情況了,我們需要同時和多個表打交道,多表查詢是資料庫中使用頻率最高和效率攸關的操作了!多表查詢主要有兩種方案 這裡主要介紹一下連線查詢!連線查詢,主要使用join關鍵字,建立多個表之間的聯絡。連線查詢可以分為,內連線和外連線,同時外連線又分為左連線和右連線。下面列出了您可以使用的 j...
SQL連線查詢 JOIN
主要列舉這個圖 或者,或者,同理,select column name s from table1 left join table2 on table1.column name table2.column name 或者,select column name s from table1 left o...
join連線查詢之外連線和交叉連線
這個是個重點 join連線的分為內連線,外連線和交叉連線.外連線分左外連線 用到關鍵字left join,使用是以left jion關鍵字左邊的表作為基表並且全部展示,右邊的表和基表關聯的資訊展示 另一種展示方式,用 標示 select from db stu s left join db clas...