PostgreSQL-join多表鏈接查詢和子查詢

1、多表鏈接查詢

一、鏈接方式概覽
[inner] join
內鏈接:表A和表B以元組爲單位作一個笛卡爾積,記爲表C,而後在C中挑選出知足符合on 語句後邊的限制條件的內容。
left [outer] join
左外鏈接:在內鏈接的基礎上,將A中有但C中沒有的元組也加上。因爲C的列數比A的行數多,因此這新增的元組左邊照搬A,右邊爲null。
right [outer] join
右外鏈接:在內鏈接的基礎上,將B中有但C中沒有的元組也加上。因爲C的列數比B的行數多,因此這新增的元組右邊照搬B,左邊爲null。
full [outer] join
全外鏈接:至關於在內鏈接的基礎上同時作左鏈接和右鏈接,表A和表B中的都要,兩邊不知足條件的都爲null。
 
cross join
與上述內外鏈接可接鏈接條件不一樣,這一個本質是 select * from tableName1, tableName2 這種無條件交叉鏈接的簡寫,如
select * from tableName1 cross join tableName2
僅是作笛卡爾積,表A的每一行都和表B的每一行相鏈接,沒有條件,不可後接on,結果是兩錶行的乘積和列的和。
 
二、條件語法概覽
table1 { [inner] | { lef t| right| full} [outer] } join table2 on boolean_expression
用 ON 關鍵詞後接鏈接條件,結果中會包含兩表中條件引用到的列(條件列不管是否同名皆可)
注:select * from table1,table2 where table1.column1=table2.column1 這是一種可替代select *from table1 [inner] join table2 on boolean_expression 的快捷語法
單純使用內鏈接的話能夠像前者這樣寫,簡便直白
table1 { [inner] | { left| right| full} [outer] } join table2 using ( join column list )
用 USING 關鍵詞後接一個用逗號分隔的字段名列表,這些字段必須是鏈接表共有的而且其值必須相同,鏈接結果去重。(條件列同名,手動指定,去重)
所以,USING (a, b, c) 等效於 ON (table1.a = table2.a AND table1.b = table2.b AND table1.c = table2.c) ,結果中abc字段各僅一個。
table1 natural { [inner] | { left| right| full} [outer] } join table2
NATURAL 是 USING 的縮寫形式:它自動造成一個由兩個表中同名的字段組成的 USING 列表。
USING 和 NATURAL 的原理是同樣的,靠兩表中同名的字段鏈接值相同的部分,不夠靈活。(條件列同名,自動尋列,去重)
 
三、簡單的栗子
有兩表A和B
A B
 
無條件鏈接
select * from A cross join B
 
有條件鏈接
select * from A full join B on A.name = B.name
[指定條件,全外鏈接]
select * from A full join B using(name)
[指定條件,全外鏈接,去重]
select * from A natural join B
[自動尋找同名字段爲條件,內鏈接,去重]
select * from A natural full join B
[自動尋找同名字段爲條件,全外鏈接,去重]
 
四、更多表鏈接
鏈接ABCDE多個表能夠這樣: 也能夠這樣:
select * from (((
A inner join B on A.a = B.b)
inner join C on C.c = A.a)
inner join D on D.d = C.c)
inner join E on E.e = D.d
select * from
A inner join B on A.a = B.b
inner join C on C.c = A.a
inner join D on D.d = C.c
inner join E on E.e = D.d
 
大多數數據庫系統會分析整個from子句,而後嘗試肯定組合鏈接表的最有效方式,也就是說數據庫不不必定會從最裏邊的括號開始執行查詢。這極可能打亂你的邏輯設計,獲得意外的結果。一些數據庫系統中的優化器對於join定義的順序很敏感。若是你發現使用不少join的查詢在一個較大的數據庫上執行花很長時間,經過改變join順序極可能可以使它運行的更快。
 

2、子查詢(subquery)

在子查詢中用到一些關鍵字,分別是「ANY、EXISTS、IN、SOME」,在這些關鍵字以前還能夠添加「NOT」。
一般的用法如:
EXISTS (subquery)
expression [NOT] IN (subquery)
row_constructor [NOT] IN (subquery)
expression operator ANY (subquery)
expression operator SOME (subquery)
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)
 
半鏈接: 對於「subquery」,使用IN、EXISTS等謂詞表示存在便可,稱之爲半鏈接。
SELECT * FROM D
WHERE EXISTS
( SELECT * FROM E WHERE D.id= E.id
AND E.s > 2500)
ORDER BY x
 
反半鏈接:對於「subquery」,使用NOT IN謂詞表示不存在便可,稱之爲反半鏈接。
SELECT * FROM E
WHERE id NOT IN
(SELECT id FROM D WHERE lid=1700)
ORDER BY id
 
 
 

整理自:
——
[原創]多表鏈接(join)小結 - ybwang1989 - 博客園
——
數據庫查詢中的錶鏈接(一) - 那海藍藍的日誌 - 網易博客
數據庫查詢中的錶鏈接(二) - 那海藍藍的日誌 - 網易博客
——
JOIN操做PostgreSql » InBi's Blog
相關文章
相關標籤/搜索