揭秘SQL中的公用表表達式:數據查詢的新寵兒

歡迎來到我的博客,代碼的世界里,每一行都是一個故事


在這里插入圖片描述

揭秘SQL中的公用表表達式:數據查詢的新寵兒

    • 前言
    • 公用表表述的概述
    • 非遞歸CTE的作用
    • 遞歸CTE的作用
    • CTE性能優化

前言

你是否曾經為SQL查詢的復雜性而困擾不已?尤其是那些讀寫層子查詢、難以理解和的代碼。公用表維護表達式(CTE)的出現,為解決這些問題提供了優雅的解決方案。無論是簡化查詢邏輯,還是實現分布式查詢,CTE都可以讓你的SQL查詢變得更加簡潔和高效。讓我們一起探索CTE的神奇世界,發現它如何讓數據查詢變得如此簡單而強大!

公用表表述的概述

公用表表達式(Common Table Expression,CTE)是一種臨時命名的結果集,它可以在一個查詢中定義,并且在該查詢的后續部分中被引用。CTE提供了一種更清晰、更模塊化的查詢結構,比傳統的子查詢更易于閱讀和維護。

與子查詢相比,CTE的優勢在于:

  1. 可讀性更強: CTE可以在查詢中以類似于表的方式命名,并且可以在查詢的后續部分中多次引用,使得查詢結構更加清晰易讀。

  2. 代碼重用性: 由于CTE可以在查詢中多次引用,因此可以在復雜查詢中重用相同的邏輯,減少重復編寫代碼的工作量。

  3. 性能優化: 數據庫優化器可以更好地優化CTE,以提高查詢性能,尤其是在涉及到遞歸查詢時。

CTE的基本語法結構如下:

WITH cte_name (column1, column2, ...) AS (-- CTE查詢定義SELECT column1, column2, ...FROM table_nameWHERE condition
)
-- 主查詢
SELECT *
FROM cte_name;

其中,cte_name是CTE的名稱,可以在主查詢中引用;(column1, column2, ...)是可選的列名列表,用于為CTE中的列指定別名;SELECT語句是CTE的查詢定義,用于生成結果集。

在主查詢中,可以使用SELECT語句引用定義的CTE,并將其視為一個臨時的虛擬表。

非遞歸CTE的作用

非遞歸的公用表表達式(CTE)可以用于簡化復雜查詢,特別是在涉及多個表和復雜邏輯的情況下。下面是一個示例,演示如何使用CTE簡化查詢部門員工信息的操作:

假設我們有兩個表:departments(部門信息)和employees(員工信息),它們之間通過部門ID進行關聯。

首先,我們可以使用CTE定義一個簡單的查詢,以獲取每個部門的員工數量:

WITH department_employee_count AS (SELECT d.department_name, COUNT(e.employee_id) AS employee_countFROM departments dLEFT JOIN employees e ON d.department_id = e.department_idGROUP BY d.department_name
)
SELECT * FROM department_employee_count;

在這個CTE中,我們通過LEFT JOIN連接departmentsemployees表,并對每個部門進行分組計數,得到每個部門的員工數量。

接下來,我們可以使用另一個CTE來獲取每個部門的平均工資:

WITH department_average_salary AS (SELECT d.department_name, AVG(e.salary) AS average_salaryFROM departments dLEFT JOIN employees e ON d.department_id = e.department_idGROUP BY d.department_name
)
SELECT * FROM department_average_salary;

在這個CTE中,我們再次使用LEFT JOIN連接departmentsemployees表,并對每個部門計算平均工資。

最后,我們可以使用這些CTE來執行更復雜的查詢,例如獲取每個部門的員工數量和平均工資:

WITH 
department_employee_count AS (SELECT d.department_name, COUNT(e.employee_id) AS employee_countFROM departments dLEFT JOIN employees e ON d.department_id = e.department_idGROUP BY d.department_name
),
department_average_salary AS (SELECT d.department_name, AVG(e.salary) AS average_salaryFROM departments dLEFT JOIN employees e ON d.department_id = e.department_idGROUP BY d.department_name
)
SELECT dec.department_name, dec.employee_count, das.average_salary
FROM department_employee_count dec
JOIN department_average_salary das ON dec.department_name = das.department_name;

在這個復雜的查詢中,我們將兩個CTE聯合起來,并使用JOIN操作來獲取每個部門的員工數量和平均工資。這樣,我們就能夠在不重復編寫代碼的情況下,獲取所需的部門員工信息,并且可以更輕松地理解和維護查詢邏輯。

遞歸CTE的作用

遞歸公用表表達式(CTE)是一種特殊類型的CTE,它允許在查詢內部遞歸引用自己,從而解決一些復雜的層次結構查詢問題,比如組織結構中的下屬員工。

下面是一個示例,演示如何使用遞歸CTE計算組織結構中的所有下屬員工:

假設我們有一個employees表,其中包含員工的ID、姓名和直接上級的ID。我們想要查找每個員工的所有下屬。

首先,我們定義一個遞歸CTE來獲取每個員工及其直接下屬的信息:

WITH RECURSIVE subordinates AS (SELECT employee_id, employee_name, manager_idFROM employeesWHERE manager_id IS NULL -- 查找頂級員工(沒有上級)UNION ALLSELECT e.employee_id, e.employee_name, e.manager_idFROM employees eINNER JOIN subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinates;

在這個遞歸CTE中,我們首先選擇所有頂級員工(沒有上級的員工),并將它們作為初始結果集。然后,我們使用UNION ALL連接當前結果集和它們的直接下屬,直到沒有更多的下屬為止。

通過這個遞歸CTE,我們可以獲取每個員工的所有下屬信息,包括直接下屬、間接下屬、間接下屬的下屬,以此類推。這樣,我們就能夠構建出完整的組織結構,幫助我們更好地理解員工之間的關系。

CTE性能優化

在處理大數據集時,使用遞歸公用表表達式(CTE)可能會導致性能問題,特別是在遞歸深度較大或數據量較大的情況下。以下是一些優化CTE查詢的技巧和建議:

  1. 限制遞歸深度: 在定義遞歸CTE時,盡量限制遞歸的深度,避免無限遞歸。可以通過設置遞歸終止條件或使用MAXRECURSION選項來限制遞歸次數。

  2. 索引支持: 確保表中的相關列(如遞歸關系的連接列)上存在適當的索引,以提高查詢性能。索引可以加速遞歸過程中的連接操作。

  3. 避免重復計算: 盡量避免在遞歸過程中重復計算相同的數據。可以使用臨時表或緩存機制存儲中間結果,以減少重復計算的開銷。

  4. 分頁處理: 如果可能的話,考慮將遞歸查詢分成多個較小的批次進行處理,而不是一次性處理整個數據集。這樣可以減少內存和資源的消耗。

  5. 使用合適的數據類型: 在定義CTE時,盡量使用合適的數據類型來減少內存消耗和計算開銷。避免使用過大或過小的數據類型。

  6. 定期優化: 對于頻繁使用的遞歸CTE查詢,定期進行性能優化和調整是很重要的。通過監控查詢性能并根據需要進行調整,可以有效提高查詢效率。

綜上所述,優化CTE查詢的性能需要綜合考慮遞歸深度、索引支持、重復計算、分頁處理、數據類型和定期優化等因素。通過合理設計查詢和持續優化,可以有效提高CTE查詢在大數據集上的性能表現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18843.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器數據恢復—RAID5陣列崩潰如何恢復上層OA和oracle數據庫的數據?

服務器數據恢復環境&故障: 某公司的一臺服務器中的raid5磁盤陣列有兩塊磁盤先后掉線,服務器崩潰。故障服務器的操作系統為linux,操作系統部署了oa,數據庫為oracle。oracle數據庫已經不再對該oa系統提供后續支持,用…

圖形學初識--矩陣和向量

文章目錄 前言正文向量什么是向量?向量涉及哪些常見計算?1、取模2、歸一化3、向量加法4、向量減法5、向量與標量乘6、向量點乘(內積)7、向量投影 向量有哪些基本應用? 矩陣什么是矩陣?矩陣涉及哪些常見計算…

數據庫中的六大鎖

目錄 一、死鎖 二、鎖的區間劃分 1、間隙鎖(Gap Locks) 2、臨鍵鎖(Next-key Locks) 三、鎖的粒度劃分 1、表級鎖(Table-level lock) 2、行級鎖(Record Locks) 3、頁級鎖 四、…

一分鐘教你學浪app視頻怎么緩存

你是否在學浪app上苦苦尋找如何緩存視頻的方法?你是否想快速、輕松地觀看自己喜歡的視頻內容?那么,讓我們一起探索一分鐘教你如何緩存學浪app視頻的技巧吧! 學浪下載工具我已經打包好了,有需要的自己下載一下 學浪下…

【JavaScript】ECMAS6(ES6)新特性概覽(二):解構賦值、擴展與收集、class類全面解析

🔥 個人主頁:空白詩 🔥 熱門專欄:【JavaScript】 文章目錄 🌿 引言五、 Destructuring Assignment - 解構賦值,數據提取的藝術 🎨📌 數組解構📌 對象解構📌 特…

動態規劃之單詞拆分

這次分享一道關于動態規劃的leetcode,單詞拆分。 單詞拆分 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。注意:不要求字典中出現的單詞全部都使用,并且字典中的單詞…

【技術】漢諾塔的遞歸問題解析及多語言實現

漢諾塔的遞歸問題解析及多語言實現 漢諾塔(Hanoi Tower)問題是一個非常經典的遞歸問題。它起源于一個古老的傳說:有三個柱子和64個大小不一的金盤,開始時這些金盤按從小到大的順序放在柱子A上,目標是在柱子B上按同樣的…

Java——Java開發環境

一、JDK 1、什么是JDK JDK(Java Development Kit,Java 開發工具包)是用于開發 Java 應用程序的核心工具包。它包含了編寫、編譯、調試和運行 Java 程序所需的一切工具和庫。JDK 是每個 Java 開發者必備的工具。 2、JDK 主要組件 JDK主要包…

HNU-計算機體系結構-實驗3-緩存一致性

計算機體系結構 實驗3 計科210X 甘晴void 202108010XXX 文章目錄 計算機體系結構 實驗31 實驗目的2 實驗過程2.0 預備知識2.0.1 多cache一致性算法——監聽法2.0.1.1 MSI協議2.0.1.2 MESI協議2.0.1.3 本題講解 2.0.2 多cache一致性算法——目錄法2.0.2.1 有中心的目錄法2.0.2…

A2B V2.0協議學習筆記(非正式版本)

一、說明 A2B全稱是 Automotive Audio Bus 汽車音頻總線,主要是解決傳統音頻總線線多、線重、成本貴等問題。 A2B V2.0總線相對V1.0主要變化點: 速率提升,高達98.304Mbps,全雙工模式 編碼方式,由之前的曼徹斯特編碼變為QPSK(正交相移鍵控)編碼,每個符合2bit數據,因此…

隨手記:多行文本域存數據有換行,回顯數據換行展示

1.在新增的時候存儲數據 <el-input type"textarea"v-model"XXXX"></el-input> 2.詳情頁返回的數據&#xff1a; replace一頓操作確實復雜 最快的方法直接寫個樣式:style"white-space: pre-line" 即可行內或者class樣式都可以 …

B2126 連續出現的字符

連續出現的字符 題目描述 給定一個字符串&#xff0c;在字符串中尋找第一個連續出現次數不低于 k k k 次的字符。 輸入格式 2 2 2 行。第 1 1 1 行是 k k k&#xff1b;第 2 2 2 行是僅包含大小寫字母的字符串。 輸出格式 字符串中第一個連續出現次數不低于 k 次的字符…

Python面試寶典:Python中與動態規劃和排序算法相關的面試筆試題(1000加面試筆試題助你輕松捕獲大廠Offer)

Python面試寶典:1000加python面試題助你輕松捕獲大廠Offer【第二部分:Python高級特性:第十二章:高級數據結構和算法:第二節:Python中實現各類高級數據結構與算法三】 第十二章:高級數據結構和算法第二節:Python中實現各類高級數據結構與算法2.3、python中與動態規劃和排…

網頁如何給js后臺傳遞數字類型參數

網頁無法通過get方法傳遞數字參數給js后臺&#xff0c;就是網頁端寫的是數字參數&#xff0c;傳遞給后臺也變成了數字字符串。而js對數字類型和字符串類型是不相同的。由于我們的代碼是通過中間件掛載接口的&#xff0c;通過joi庫檢查參數。 const Joi require(joi); //注意&…

秋招突擊——算法打卡——5/28——復習{Z字形變換、兩數之和}——新做:{整數反轉、字符串轉整數}

文章目錄 復習Z字形變換實現代碼參考代碼 兩數之和復習代碼 新作整數反轉個人實現實現代碼 參考做法字符串轉換整數個人解法 分析總結 復習 Z字形變換 實現代碼 這里使用了他的思想&#xff0c;但是沒有用他的代碼&#xff0c;雖然已經比上次簡潔了&#xff0c;但是還是不夠&…

【日記】終于鼓起勇氣買了吹風機!(356 字)

正文 好忙。今天比昨天還要忙&#xff0c;水都沒喝幾口。嗯&#xff0c;好像只喝了兩口。 今天補了一份印鑒卡&#xff0c;銷了一個戶&#xff0c;變了一個戶&#xff0c;弄了一大堆資料找人簽字&#xff0c;還順帶要解決一個押品的歷史遺留問題。 中午睡得好香&#xff0c;都不…

如何理解和使用 this 關鍵字

this 關鍵字是許多編程語言中的一個核心概念&#xff0c;在面向對象編程&#xff08;OOP&#xff09;中尤為重要。在JavaScript、Java、C、C#等語言中&#xff0c;this 扮演著至關重要的角色。理解 this 的意義和用法&#xff0c;對于編寫清晰、有效的代碼至關重要。 什么是th…

超分論文走讀

codeFormer 原始動機 高度不確定性&#xff0c;模糊到高清&#xff0c;存在一對多的映射紋理細節丟失人臉身份信息丟失 模型實現 訓練VQGAN 從而得到HQ碼本空間作為本文的離散人臉先驗。為了降低LQ-HQ映射之間的不確定性&#xff0c;我們設計盡量小的碼本空間和盡量短的Code…

ECS搭建2.8版本的redis

要在ECS&#xff08;Elastic Compute Service&#xff09;上手動搭建Redis 2.8版本&#xff0c;你可以按照以下步驟操作&#xff1a; 步驟1&#xff1a;更新系統和安裝依賴 首先&#xff0c;登錄到你的ECS實例&#xff0c;確保系統是最新的并安裝必要的依賴包&#xff1a; s…

運營推廣最容易被忽略的細節!用短鏈接推廣必須要掌握這些要點!

短鏈接是目前很多企業進行網絡推廣最常用的方式之一&#xff0c;是引流轉化的重要橋梁&#xff0c;很多工作者可能覺得用短鏈接推廣&#xff0c;只需要簡簡單單的把生成好的短鏈接放上去就行&#xff0c;但是實際上有很多細節要點是需要著重注意的&#xff0c;今天小編就圍繞這…