一、多表連接查詢 1、連接 [inner] join 內連接:表A和表B以元組為單位做一個笛卡爾積,記為表C,然後在C中挑選出滿足符合on 語句後邊的限制條件的條目。建立條件的方式可選 natural 做自然連接,去除重覆的列。 left [outer] join 左外連接:在內連接的基礎上,將A中 ...
一、多表連接查詢
1、連接 [inner] join 內連接:表A和表B以元組為單位做一個笛卡爾積,記為表C,然後在C中挑選出滿足符合on 語句後邊的限制條件的條目。建立條件的方式可選 natural 做自然連接,去除重覆的列。 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 cross join tableName2 同 select * from tableName1, tableName2,僅是做笛卡爾積,表A的每一行都和表B的每一行相連接,這樣的連接沒有條件限制,結果是兩表行的乘積和列的和。 2、條件連接完整語法 T1 { [inner] | { left| right| full} [outer] } join T2 on boolean_expression 用 ON 關鍵詞後接連接條件,結果中會包含兩表中條件引用到的列 T1 { [inner] | { left| right| full} [outer] } join T2 using ( join column list ) 用 USING 關鍵詞後接一個用逗號分隔的欄位名列表,這些欄位必須是連接表共有的並且其值必須相同,連接結果去重。 因此,USING (a, b, c) 等效於 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) ,結果中abc欄位各僅一個。 T1 natural { [inner] | { left| right| full} [outer] } join T2 NATURAL 是 USING 的縮寫形式:它自動形成一個由兩個表中同名的欄位組成的 USING 列表。 USING 和 NATURAL 的原理是一樣的,靠兩表中同名的欄位連接值相同的部分,不夠靈活。 3、簡單的慄子 有兩表A和B select * from A cross join A select * from A full join B on A.name = B.name select * from A full join B using(name) 則結果中只有一個 name select * from A natural join B 同上 4、更多表連接連接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 |
二、子查詢(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整理自: —— ybwang1989 - 博客園 —— 資料庫查詢中的表連接(一) - 那海藍藍的日誌 - 網易博客 資料庫查詢中的表連接(二) - 那海藍藍的日誌 - 網易博客 —— JOIN操作PostgreSql » InBi's Blog