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

来源:http://www.cnblogs.com/right-dress/archive/2016/09/07/5849848.html
-Advertisement-
Play Games

一、多表連接查詢 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
  大多數資料庫系統會分析整個from子句,然後嘗試確定組合連接表的最有效方式,也就是說資料庫不不一定會從最裡邊的括弧開始執行查詢。這很可能打亂你的邏輯設計,得到意外的結果。一些資料庫系統中的優化器對於join定義的順序很敏感。如果你發現使用很多join的查詢在一個較大的資料庫上執行花很長時間,通過改變join順序很可能能夠使它運行的更快。  

二、子查詢(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
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 仿造美圖秀秀移動滑鼠調整seekbar,調整圖片的顏色 項目佈局如下: 效果如下: 邏輯部分代碼如下: 運行效果: ...
  • 安裝eclipse for android 時候的錯誤記錄,轉載自:http://blog.csdn.net/chenyufeng1991/article/details/47442555 (1)打開Preferences,在Windows下麵應該在WIndow-->Preferences.在mac ...
  • Android的SharedPreferences用來存儲一些鍵值對, 但是卻不支持跨進程使用. 跨進程來用的話, 當然是放在資料庫更可靠啦, 本文主要是給作者的新庫[PreferencesProvider](https://github.com/mengdd/PreferencesProvider... ...
  • 原諒我只提供一個鏈接,我在這裡寫了兩遍,最後加個鏈接頁面卡死了,下麵的demo,最好真機調試。(寫博客還是在別的地方寫複製到這裡比較好!) https://pan.baidu.com/s/1mi2fHDu 另外還有一些資料分享,喜歡的可以看一下:http://www.cnblogs.com/ljcg ...
  • 今天總結一下android客戶端從伺服器端獲取json數據的實現代碼,需要的朋友可以參考下 首先客戶端從伺服器端獲取json數據 1、利用HttpUrlConnection /** * 從指定的URL中獲取數組 * @param urlPath * @return * @throws Excepti ...
  • 在網上看了很多資料都是空說一談,都只是說很簡單,然後沒有說遇到這樣的情況具體該怎麼做,看到這裡都知道是許可權問題,其實我們每一個人都知道,又是我覺得我還是要給以後遇到的朋友個解決方法: 這裡用到的資料庫是08版本的,出現了這種一直報許可權錯誤:錯誤截圖如下: 所見效果描述:在windows身份驗證的 情 ...
  • 一、導出數據外部 1)mysql連接+將查詢結果輸出到文件。在命令行中執行(windows的cmd命令行,mac的終端) -h:後面跟的是鏈接的host(主機) -u:後面跟的是用戶名 -p:後面跟的是密碼 db:你要查詢的資料庫 file:你要寫入的文件,絕對路徑 例如: 下麵將 sql語句 se ...
  • 作為DBA,時不時會遇到將數據導入到資料庫的情況,假設業務或研發提供一個包含上百萬行INSERT語句的腳本文件,而且這些INSERT 語句沒有使用GO來進行批處理拆分,那麼直接使用SQLCMD來執行會發現該進程消耗大量物理記憶體並遲遲沒有數據寫入,即使腳本中每一行都添加了GO,你依然會發現這插入效率太 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...