WITH在MYSQL中的用法

WITH 子句(也稱為公共表表達式,Common Table Expression,簡稱 CTE)是 SQL 中一種強大的查詢構建工具,它可以顯著提高復雜查詢的可讀性和可維護性

一、基本語法結構

WITH cte_name AS (SELECT ...  -- 定義CTE的查詢
)
SELECT ... FROM cte_name;  -- 主查詢使用CTE

二、CTE 的核心特點

  1. 臨時結果集:CTE 只在當前查詢執行期間存在
  2. 可引用性:定義后可在主查詢中多次引用
  3. 作用域限制:僅在緊隨其后的單個語句中有效

三、MySQL 中 CTE 的具體用法

1. 基本 CTE(單表表達式)

WITH sales_summary AS (SELECT product_id, SUM(quantity) AS total_soldFROM ordersGROUP BY product_id
)
SELECT p.product_name, s.total_sold
FROM products p
JOIN sales_summary s ON p.product_id = s.product_id;

2. 多 CTE 定義(逗號分隔)

WITH 
customer_orders AS (SELECT customer_id, COUNT(*) AS order_countFROM ordersGROUP BY customer_id
),
high_value_customers AS (SELECT customer_idFROM customer_ordersWHERE order_count > 5
)
SELECT c.customer_name
FROM customers c
JOIN high_value_customers h ON c.customer_id = h.customer_id;

3. 遞歸 CTE(MySQL 8.0+ 支持)

遞歸 CTE 用于處理層次結構數據:

WITH RECURSIVE org_hierarchy AS (-- 基礎查詢(錨成員)SELECT id, name, parent_id, 1 AS levelFROM organizationWHERE parent_id IS NULLUNION ALL-- 遞歸查詢(遞歸成員)SELECT o.id, o.name, o.parent_id, h.level + 1FROM organization oJOIN org_hierarchy h ON o.parent_id = h.id
)
SELECT * FROM org_hierarchy;

四、CTE 的優勢

  1. 提高可讀性

    • 將復雜查詢分解為邏輯塊
    • 類似編程中的變量定義
  2. 避免重復子查詢

    -- 不使用CTE(重復子查詢)
    SELECT * FROM (SELECT ... FROM table1) AS t1
    JOIN (SELECT ... FROM table1) AS t2...-- 使用CTE(避免重復)
    WITH t1 AS (SELECT ... FROM table1)
    SELECT * FROM t1 JOIN t1 AS t2...
    
  3. 支持遞歸查詢:處理樹形/層次結構數據

五、CTE 與臨時表的區別

特性CTE臨時表
生命周期僅當前語句有效會話結束前有效
存儲不物理存儲可能存儲在內存或磁盤
索引不能創建索引可以創建索引
可見性僅定義它的查詢可見同一會話的后續查詢可見
性能優化器可能內聯展開需要實際創建和填充

六、實際應用場景

1. 復雜報表查詢

WITH 
monthly_sales AS (...),
product_ranking AS (...)
SELECT ... FROM monthly_sales JOIN product_ranking...

2. 數據清洗管道

WITH 
raw_data AS (...),
cleaned_data AS (...),
enriched_data AS (...)
SELECT * FROM enriched_data;

3. 層次結構遍歷(組織架構、評論線程等)

WITH RECURSIVE comment_tree AS (...)
SELECT * FROM comment_tree;

七、性能注意事項

  1. 物化提示

    WITH cte_name AS (SELECT /*+ MATERIALIZE */ ...  -- 強制物化
    )
    
  2. 合并提示

    WITH cte_name AS (SELECT /*+ MERGE */ ...  -- 強制合并到主查詢
    )
    
  3. 遞歸深度控制(MySQL 默認 1000):

    SET @@cte_max_recursion_depth = 2000;
    

八、版本兼容性

  • MySQL 8.0+ 完整支持 CTE 和遞歸 CTE
  • MySQL 5.7 及更早版本不支持 CTE

WITH 子句是現代 SQL 開發中不可或缺的工具,合理使用可以大幅提升查詢的清晰度和維護性,特別是在處理多層嵌套或遞歸數據時。

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

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

相關文章

多序列比對軟件MAFFT介紹

MAFFT(Multiple Alignment using Fast Fourier Transform)是一款廣泛使用且高效的多序列比對軟件,由日本京都大學的Katoh Kazutaka等人開發,最早發布于2002年,并持續迭代優化至今。 它支持從幾十條到上萬條核酸或蛋白質序列的快速比對,同時在準確率和計算效率之間提供靈…

APP 設計中的色彩心理學:如何用色彩提升用戶體驗

在數字化時代,APP 已成為人們日常生活中不可或缺的一部分。用戶在打開一個 APP 的瞬間,首先映入眼簾的便是其色彩搭配,而這些色彩并非只是視覺上的裝飾,它們蘊含著強大的心理暗示力量,能夠潛移默化地影響用戶的情緒、行…

Compose 中使用 WebView

在 Jetpack Compose 中,我們可以使用 AndroidView 組件來集成傳統的 Android WebView。以下是幾種實現方式: 基礎 WebView 實現 Composable fun WebViewScreen(url: String) {AndroidView(factory { context ->WebView(context).apply {// 設置布局…

2025年01月03日美蜥(杭州普瑞兼職)二面

目錄 為何 nginx 可以實現跨域請求,原理是什么為何 nodejs 可以實現跨域請求,原理是什么瀏覽器的請求頭有哪些瀏覽器的響應頭有哪些瀏覽器輸入網址后發生什么http 協議和 https 有什么區別你的核心優勢是什么瀏覽器緩存機制https 的加密機制tcp 的三次握…

如何選擇合適的光源?

目錄 工業相機光源類型全面指南 1. 環形光源及其變體 高角度環形光源 優點 缺點 典型應用場景 低角度環形光源(暗場照明) 優點 缺點 典型應用場景 2. 條形光源與組合照明系統 技術特點 組合條形光源 優點 缺點 典型應用場景 3. 同軸光源…

「OC」源碼學習——對象的底層探索

「OC」源碼學習——對象的底層探索 前言 上次我們說到了源碼里面的調用順序,現在我們繼續了解我們上一篇文章沒有講完的關于對象的內容函數,完整了解對象的產生對于isa賦值以及內存申請的內容 函數內容 先把_objc_rootAllocWithZone函數的內容先貼上…

【C++指南】STL list容器完全解讀(一):從入門到掌握基礎操作

. 💓 博客主頁:倔強的石頭的CSDN主頁 📝Gitee主頁:倔強的石頭的gitee主頁 ? 文章專欄:《C指南》 期待您的關注 文章目錄 一、初識list容器1.1 什么是list?1.2 核心特性1.3 典型應用場景 二、核心成員函數…

labelimg快捷鍵

一、核心標注快捷鍵 ?W?:調出標注十字架,開始繪制矩形框(最常用功能)?A/D?:切換上一張(A)或下一張(D)圖片,實現快速導航?Del?:刪除當前選中的標注框 二、文件操作快捷鍵 ?CtrlS?&…

linux-文件操作

在 Linux 系統中,文件操作與管理是日常使用和系統管理的重要組成部分。下面將詳細介紹文件的復制、移動、鏈接創建,以及文件查找、文本處理、排序、權限管理等相關知識。 一、文件的復制 在 Linux 里,cp 命令可用于復制文件或目錄&#xff…

C++ 復習

VS 修改 C 語言標準 右鍵項目-屬性 輸入輸出 //引用頭文件&#xff0c;用<>包裹起來的一般是系統提供的寫好的代碼 編譯器會在專門的系統路徑中去進行查找 #include <iostream> //自己寫的代碼文件一般都用""包裹起來 編譯器會在當前文件所在的目錄中査…

openGauss新特性 | HTAP新特性介紹

一、行列融合功能簡介 HTAP 行列融合特性在單機、主備場景下&#xff0c;通過節點的行列雙格式內存模式&#xff0c;實現openGauss HTAP一體化數據庫架構。 通過高效的行列轉換技術方案&#xff0c;節點讀取磁盤行存數據&#xff0c;生成列存儲單元&#xff08;Column Unit&am…

雙目測量中的將視差圖重投影成三維坐標圖

雙目測距主要步驟如下&#xff1a; 左右兩張圖片 → 匹配 → 得到視差圖 disp&#xff1b; 使用 cv2.reprojectImageTo3D(disp, Q) 將視差圖 重投影 成三維坐標圖 → 得到 points_3d 什么是 points_3d&#xff1f; points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…

《深度剖析:SOAP與REST,API集成的兩極選擇》

API作為不同系統之間交互的橋梁&#xff0c;其設計與實現的優劣直接影響著整個軟件生態的運轉效率。而在API的設計領域&#xff0c;SOAP和REST猶如兩座巍峨的山峰&#xff0c;各自代表著截然不同的設計理念與應用方向&#xff0c;成為開發者在構建API時必須慎重權衡的關鍵選項。…

非對稱加密算法(RSA、ECC、SM2)——密碼學基礎

對稱加密算法&#xff08;AES、ChaCha20和SM4&#xff09;Python實現——密碼學基礎(Python出現No module named “Crypto” 解決方案) 這篇的續篇&#xff0c;因此實踐部分少些&#xff1b; 文章目錄 一、非對稱加密算法基礎二、RSA算法2.1 RSA原理與數學基礎2.2 RSA密鑰長度…

Pillow 玩圖術:輕松獲取圖片尺寸和顏色模式

前言 在這個“圖像為王”的時代,誰還敢說自己沒被一張圖折磨過?一張圖片不講武德,說崩就崩,說卡就卡,仿佛像素里藏著程序員的眼淚。不管你是網頁設計師、AI煉丹師,還是只是想把貓片修得像藝術品,圖片的尺寸和顏色模式都是你必須掌握的第一手情報。如果你不知道它有多寬…

下載core5compat 模塊時,被禁止,顯示 - servese replied: Forbbidden. -->換鏡像源

怎么解決&#xff1f; --->換鏡像源 方法 1&#xff1a;使用命令行參數指定鏡像源 在運行 Qt 安裝器時&#xff0c;通過 --mirror 參數指定鏡像源&#xff1a; # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行為的好處 可以把復雜的界面邏輯抽象出去&#xff0c;讓xaml的界面設計更簡單&#xff0c;更清爽 1.安裝包 Microsoft.Xaml.Behaviors.Wpf2.簡單實現拖動效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趨勢日報 (2025年05月03日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image? 1582? 59337Python2aip…

Oracle OCP認證考試考點詳解083系列08

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 36. 第36題&#xff1a; 題目 解析及答案&#xff1a; 關于數據庫閃回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

優化01-統計信息

Oracle 的統計信息是數據庫優化器生成高效執行計劃的核心依據。它記錄了數據庫對象&#xff08;如表、索引、列等&#xff09;的元數據信息&#xff0c;幫助優化器評估查詢成本并選擇最優執行路徑。以下是關于 Oracle 統計信息的詳細介紹&#xff1a; 一、統計信息的分類 表統…