PosegreSQL基礎回顧(第 6 章 數據操縱、第 7 章 查詢)

来源:https://www.cnblogs.com/soulxj/archive/2020/05/07/12841937.html
-Advertisement-
Play Games

來源:http://www.postgres.cn/docs/11/ 6.4. 從修改的行中返回數據 有時在修改行的操作過程中獲取數據很有用。INSERT、 UPDATE和DELETE命令都有一個支持這個的可選的 RETURNING子句。使用RETURNING 可以避免執行額外的資料庫查詢來收集數據 ...


來源:http://www.postgres.cn/docs/11/

6.4. 從修改的行中返回數據

有時在修改行的操作過程中獲取數據很有用。INSERT、 UPDATEDELETE命令都有一個支持這個的可選的 RETURNING子句。使用RETURNING 可以避免執行額外的資料庫查詢來收集數據,並且在否則難以可靠地識別修改的行時尤其有用。

如果目標表上有觸發器(第 39 章),可用於RETURNING 的數據是被觸發器修改的行。因此,檢查由觸發器計算的列是 RETURNING的另一個常見用例。

7.2.1.1. 連接表

交叉連接

T1 CROSS JOIN T2

對來自於T1T2的行的每一種可能的組合(即笛卡爾積),連接表將包含這樣一行:它由所有T1裡面的列後面跟著所有T2裡面的列構成。如果兩個表分別有 N 和 M 行,連接表將有 N * M 行。FROM T1 CROSS JOIN T2等效於FROM T1 INNER JOIN T2 ON TRUE(見下文)。它也等效於FROM T1,T2

 註意

當多於兩個表出現時,後一種等效並不嚴格成立,因為JOIN比逗號綁得更緊。例如FROM T1 CROSS JOIN T2 INNER JOIN T3 ON conditionFROM T1,T2 INNER JOIN T3 ON condition並不完全相同,因為第一種情況中的condition可以引用T1,但在第二種情況中卻不行。

條件連接
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2

INNEROUTER對所有連接形式都是可選的。INNER是預設;LEFTRIGHTFULL指示一個外連接。

連接條件ONUSING子句中指定, 或者用關鍵字NATURAL隱含地指定。連接條件決定來自兩個源表中的哪些行是匹配”的,這些我們將在後文詳細解釋。

可能的條件連接類型是:

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 的列用空值補齊。

USING是個縮寫符號,它允許你利用特殊的情況:連接的兩端都具有相同的連接列名。它接受共用列名的一個逗號分隔列表,並且為其中每一個共用列構造一個包含等值比較的連接條件。例如用USING (a, b)連接T1T2會產生連接條件ON T1.a = T2.a AND T1.b = T2.b

更進一步,JOIN USING的輸出會廢除冗餘列:不需要把匹配上的列都列印出來,因為它們必須具有相等的值。不過JOIN ON會先產生來自T1的所有列,後面跟上所有來自T2的列;而JOIN USING會先為列出的每一個列對產生一個輸出列,然後先跟上來自T1的剩餘列,最後跟上來自T2的剩餘列。

最後,NATURALUSING的縮寫形式:它形成一個USING列表, 該列表由那些在兩個表裡都出現了的列名組成。和USING一樣,這些列只在輸出表裡出現一次。如果不存在公共列,NATURAL JOIN的行為將和JOIN ... ON TRUE一樣產生交叉集連接。

註意

USING對於連接關係中的列改變是相當安全的,因為只有被列出的列會被組合成連接條件。NATURAL的風險更大,因為如果其中一個關係的模式改變會導致出現一個新的匹配列名,就會導致連接將新列也組合成連接條件。

7.2.1.2. 表和列別名

別名成為當前查詢的表引用的新名稱 — 我們不再能夠用該表最初的名字引用它了。因此,下麵的用法是不合法的:

SELECT * FROM my_table AS m WHERE my_table.a > 5;    -- 錯誤

表別名主要用於簡化符號,但是當把一個表連接到它自身時必須使用別名,例如:

SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;

7.2.1.3. 子查詢

子查詢指定了一個派生表,它必須被包圍在圓括弧里並且必須被賦予一個表別名。

一個子查詢也可以是一個VALUES列表:FROM (VALUES ('anne', 'smith'), ('bob', 'jones'), ('joe', 'blow')) AS names(first, last)

再次的,這裡要求一個表別名。為VALUES列表中的列分配別名是可選的,但是選擇這樣做是一個好習慣。

7.2.1.4. 表函數

表函數是那些生成一個行集合的函數,這個集合可以是由基本數據類型(標量類型)組成, 也可以是由複合數據類型(表行)組成。

更多 

7.2.3. GROUP BYHAVING子句

在嚴格的 SQL 里,GROUP BY只能對源表的列進行分組,但PostgreSQL把這個擴展為也允許GROUP BY去根據選擇列表中的列分組。也允許對值表達式進行分組,而不僅是簡單的列名。

7.2.4. GROUPING SETSCUBEROLLUP

使用分組集的概念可以實現比上述更加複雜的分組操作。由 FROMWHERE子句選出的數據被按照每一個指定的分組集單獨分組,按照簡單GROUP BY子句對每一個分組計算 聚集,然後返回結果。

7.2.5. 視窗函數處理

如果查詢包含任何視窗函數(見第 3.5 節第 9.21 節第 4.2.8 節),這些函數將在任何分組、聚集和HAVING過濾被執行之後被計算。也就是說如果查詢使用了任何聚集、GROUP BYHAVING,則視窗函數看到的行是分組行而不是來自於FROM/WHERE的原始表行。 

7.3.3. DISTINCT

如果兩行里至少有一個列有不同的值,那麼我們認為它是可區分的。空值在這種比較中被認為是相同的。 

7.4. 組合查詢

兩個查詢的結果可以用集合操作並、交、差進行組合。

為了計算兩個查詢的並、交、差,這兩個查詢必須是並操作相容的”,也就意味著它們都返回同樣數量的列, 並且對應的列有相容的數據類型,如第 10.5 節中描述的那樣。 

7.5. 行排序 

NULLS FIRSTNULLS LAST選項將可以被用來決定在排序順序中,空值是出現在非空值之前或者出現在非空值之後。

預設情況下,排序時空值被認為比任何非空值都要大,即NULLS FIRSTDESC順序的預設值,而不是NULLS LAST的預設值。

註意順序選項是對每一個排序列獨立考慮的。例如ORDER BY x, y DESC表示ORDER BY x ASC, y DESC,而和ORDER BY x DESC, y DESC不同。

ORDER BY可以被應用於UNIONINTERSECTEXCEPT組合的結果,但是在這種情況中它只被允許根據輸出列名或編號排序,而不能根據表達式排序。 

7.6. LIMITOFFSET

LIMIT ALL的效果和省略LIMIT子句一樣,就像是LIMIT帶有 NULL 參數一樣。

OFFSET說明在開始返回行之前忽略多少行。OFFSET 0的效果和省略OFFSET子句是一樣的,就像是OFFSET帶有 NULL 參數一樣。

如果OFFSETLIMIT都出現了, 那麼在返回LIMIT個行之前要先忽略OFFSET行。

如果使用LIMIT,那麼用一個ORDER BY子句把結果行約束成一個唯一的順序是很重要的。否則你就會拿到一個不可預料的該查詢的行的子集。你要的可能是第十到第二十行,但以什麼順序的第十到第二十?除非你指定了ORDER BY,否則順序是不知道的。

7.8. WITH查詢(公共表表達式)

WITH提供了一種方式來書寫在一個大型查詢中使用的輔助語句。這些語句通常被稱為公共表表達式或CTE,它們可以被看成是定義只在一個查詢中存在的臨時表。在WITH子句中的每一個輔助語句可以是一個SELECTINSERTUPDATEDELETE,並且WITH子句本身也可以被附加到一個主語句,主語句也可以是SELECTINSERTUPDATEDELETE

7.8.1. WITH中的SELECT

遞歸:可選的RECURSIVE修飾符將WITH從單純的句法便利變成了一種在標準SQL中不能完成的特性。通過使用RECURSIVE,一個WITH查詢可以引用它自己的輸出。

7.8.2. WITH中的數據修改語句

你可以在WITH中使用數據修改語句(INSERTUPDATEDELETE)。

如果一個WITH中的數據修改語句缺少一個RETURNING子句,則它形不成臨時表並且不能在剩餘的查詢中被引用。

更多


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝:yum install firewalld 1、firewalld的基本使用 啟動: systemctl start firewalld 查看狀態: systemctl status firewalld 禁用,禁止開機啟動: systemctl disable firewalld 停止運行: ...
  • [TOC] 前言 1.備份數據的意義 運維工作的核心簡單概括起來就是兩件事:第一個是保護公司的數據,第二個是讓網站能夠7 24小時提供服務。 雖然這兩件事情都很重要,但是相比較而言,丟失一部分數據和讓網站7 24小時提供服務,哪個更重要呢? 對於絕大多數企業來講,失去數據就相當於失去商機,失去產品, ...
  • 虛擬機 下安裝tools tools安裝後桌面會全屏,自適應屏幕 環境準備 虛擬機 "安裝虛擬機教程" linux系統 "ubuntu下載地址" 1. 虛擬機中點擊》虛擬機》安裝tool 2. 打開終端命令視窗(快捷鍵ctrl+alt+t) 3. 輸入su 擁有超級用戶的許可權(提示:第一次打開是沒有 ...
  • ​作者:良知猶存 轉載授權以及圍觀:歡迎添加微信:Allen-Iverson-me-LYN 前言 最近想開發一段單片機的代碼,代碼本身有很多的重覆元素,這重覆定義的一些結構體使用起來有些繁瑣,所以就想用C++開發,C++的繼承 模板類可以很容易的解決這些問題。因為在單片機運行,習慣用MDK或者IAR ...
  • 第四天MySQL 連接查詢(內連接、外連接、交叉連接)(sql99版本下) 子查詢: select 後面(標量子查詢) from 後面(表子查詢) where 或having後面(標量子查詢、列子查詢、行子查詢) exists後面(相關子查詢)(表子查詢) ...
  • 來源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三種獨立的實現模式匹配的方法:SQL LIKE操作符、更近一些的SIMILAR TO操作符(SQL:1999 里添加進來的)和POSIX-風格的正則表達式。除了這些基本的“這個串匹配這 ...
  • 本篇博客參考掘金小冊—— "MySQL 是怎樣運行的:從根兒上理解 MySQL" 先給大家講一個故事,我剛參加工作,在一個小作坊裡面當【碼畜】(儘管現在也是),有一天老闆從我背後走過,說了一句舉世震驚的話:我看你們的資料庫和excel一樣,不就是一行行數據,人家excel還可以對單元格進行美化,還有 ...
  • 業務情景 客戶環境是系統A的1.0版本,開發環境是系統A的2.0版本。2.0版本對於資料庫有部分變更(主要是新增表和欄位,不涉及欄位刪除和變更)。這個時候需要在客戶環境安裝資料庫2.0(表結構、存儲過程都是用的2.0),但是數據要把1.0的同步過來。 實際操作 1、 表結構複製 右擊2.0版本的數據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...