目錄
什麼是CTE?
CTE 的基本語法
CTE 和子查詢的區別
使用遞歸CTE 處理層級數據
實際應用建議
首頁 資料庫 mysql教程 使用MySQL 8中的常見表表達式(CTE)

使用MySQL 8中的常見表表達式(CTE)

Jul 12, 2025 am 02:23 AM
mysql CTE

CTEs 是MySQL 8.0 引入的特性,提升複雜查詢的可讀性與維護性。 1. CTE 是臨時結果集,僅在當前查詢中有效,結構清晰,支持重複引用;2. 相比子查詢,CTE 更易讀、可重用且支持遞歸;3. 遞歸CTE 可處理層級數據,如組織結構,需包含初始查詢與遞歸部分;4. 使用建議包括避免濫用、命名規範、關注性能及調試方法。

Using Common Table Expressions (CTEs) in MySQL 8

CTEs(Common Table Expressions)是MySQL 8.0 引入的一個非常實用的特性,它讓複雜查詢更清晰、可讀性更強。如果你之前寫過嵌套子查詢或者多層派生表的SQL,用上CTE 後會發現結構更清爽,也更容易維護。

Using Common Table Expressions (CTEs) in MySQL 8

什麼是CTE?

CTE 就是一個臨時的結果集,你可以在一個查詢中定義它,並在後續的查詢中像使用普通表一樣引用它。它只在當前查詢執行期間存在,不會持久化到數據庫裡。

Using Common Table Expressions (CTEs) in MySQL 8

舉個簡單的例子:你想查出每個部門工資最高的員工。如果不用CTE,可能得寫多個子查詢嵌套,邏輯繞。而用CTE 的話,可以先把“每個部門最高工資”作為一個中間結果,再關聯員工表來篩選數據。

 WITH MaxSalaries AS (
    SELECT department_id, MAX(salary) AS max_salary
    FROM employees
    GROUP BY department_id
)
SELECT e.*
FROM employees e
JOIN MaxSalaries ms
ON e.department_id = ms.department_id AND e.salary = ms.max_salary;

這樣看起來是不是更直觀了?而且你還可以在一個查詢裡定義多個CTE,按需組合使用。

Using Common Table Expressions (CTEs) in MySQL 8

CTE 的基本語法

CTE 的結構很明確,開頭是WITH ,然後是你給這個臨時結果集起的名字,接著是括號裡的查詢語句。之後就可以在這個查詢範圍內反複使用這個名字了。

格式如下:

 WITH cte_name [(column_list)] AS (
    -- 查詢語句)
-- 後續使用CTE 的主查詢

幾點注意:

  • CTE 可以帶列名,如果不指定的話,默認會從查詢中自動獲取。
  • 如果有多個CTE,可以用逗號分隔開,依次定義。
  • CTE 只在當前查詢中有效,不能跨查詢復用。

CTE 和子查詢的區別

很多人會問:CTE 跟子查詢有什麼區別?其實它們在功能上很相似,但CTE 在可讀性和重用性方面更有優勢。

對比項子查詢CTE
結構清晰度嵌套深時難以閱讀更容易拆分和理解
重複使用不方便,需要復制粘貼可多次引用
遞歸支持不支持支持遞歸CTE(後面再說)

比如你要在多個地方都用到“某個月份的銷售匯總”,用子查詢就得寫好幾遍,而用CTE 只要定義一次就能多次調用。


使用遞歸CTE 處理層級數據

MySQL 8.0 還支持遞歸CTE ,非常適合處理樹形結構或層級數據,比如組織架構、分類目錄、評論回复鍊等。

假設你有一個employees表,裡麵包含員工ID 和上級經理ID,你想找出某個領導下面的所有下屬,這時候遞歸CTE 就派上用場了。

示例代碼如下:

 WITH RECURSIVE Subordinates AS (
    SELECT employee_id, manager_id, name
    FROM employees
    WHERE manager_id = 100 -- 初始條件:查找直接下屬UNION ALL

    SELECT e.employee_id, e.manager_id, e.name
    FROM employees e
    INNER JOIN Subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM Subordinates;

這段代碼先選出直屬下級,然後不斷遞歸地找這些人的下屬,直到沒有更多記錄為止。遞歸CTE 的核心就是兩個部分:

  • 初始查詢(non-recursive part)
  • 遞歸部分(recursive part),通過UNION ALL連接

需要注意的是,遞歸不能無限進行下去,否則會報錯。你可以通過設置cte_max_recursion_depth來控制最大遞歸深度。


實際應用建議

CTE 很強大,但在實際使用時也有一些小技巧和注意事項:

  • 別濫用CTE :不是所有場景都適合用CTE,簡單查詢沒必要拆分成CTE,反而增加複雜度。
  • 命名規範:給CTE 起個有意義的名字,比如TopCustomersRecentOrders ,有助於別人理解你的邏輯。
  • 性能問題:CTE 並不一定會提升性能,它更像是邏輯上的封裝。如果對性能敏感,最好結合索引和執行計劃一起分析。
  • 調試方法:想看看CTE 中間結果?可以直接把CTE 寫完後SELECT * FROM cte_name ,方便調試。

基本上就這些。 CTE 是現代SQL 中非常實用的一部分,尤其是在寫複雜查詢的時候,能幫你理清思路,提高可讀性。剛開始可能不太習慣,但一旦用上手,你會發現寫SQL 的體驗真的不一樣。

以上是使用MySQL 8中的常見表表達式(CTE)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

Rimworld Odyssey溫度指南和Gravtech
1 個月前 By Jack chen
Rimworld Odyssey如何釣魚
1 個月前 By Jack chen
我可以有兩個支付帳戶嗎?
1 個月前 By 下次还敢
初學者的Rimworld指南:奧德賽
1 個月前 By Jack chen
PHP變量範圍解釋了
3 週前 By 百草

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1603
29
PHP教程
1506
276
如何在PHP環境中設置環境變量 PHP運行環境變量添加說明 如何在PHP環境中設置環境變量 PHP運行環境變量添加說明 Jul 25, 2025 pm 08:33 PM

PHP設置環境變量主要有三種方式:1.通過php.ini全局配置;2.通過Web服務器(如Apache的SetEnv或Nginx的fastcgi_param)傳遞;3.在PHP腳本中使用putenv()函數。其中,php.ini適用於全局且不常變的配置,Web服務器配置適用於需要隔離的場景,putenv()適用於臨時性的變量。持久化策略包括配置文件(如php.ini或Web服務器配置)、.env文件配合dotenv庫加載、CI/CD流程中動態注入變量。安全管理敏感信息應避免硬編碼,推薦使用.en

如何用PHP搭建在線客服機器人 PHP智能客服實現技術 如何用PHP搭建在線客服機器人 PHP智能客服實現技術 Jul 25, 2025 pm 06:57 PM

PHP在智能客服中扮演連接器和大腦中樞角色,負責串聯前端輸入、數據庫存儲與外部AI服務;2.實現時需構建多層架構:前端接收用戶消息,PHP後端預處理並路由請求,先匹配本地知識庫,未命中則調用外部AI服務如OpenAI或Dialogflow獲取智能回复;3.會話管理由PHP寫入MySQL等數據庫,保障上下文連續性;4.集成AI服務需用Guzzle發送HTTP請求,安全存儲APIKey,做好錯誤處理與響應解析;5.數據庫設計需包含會話、消息、知識庫、用戶表,合理建索引、保障安全與性能,支撐機器人記憶

如何讓PHP容器支持自動構建 PHP環境持續集成CI配置方式 如何讓PHP容器支持自動構建 PHP環境持續集成CI配置方式 Jul 25, 2025 pm 08:54 PM

要讓PHP容器支持自動構建,核心在於配置持續集成(CI)流程。 1.使用Dockerfile定義PHP環境,包括基礎鏡像、擴展安裝、依賴管理和權限設置;2.配置GitLabCI等CI/CD工具,通過.gitlab-ci.yml文件定義build、test和deploy階段,實現自動構建、測試和部署;3.集成PHPUnit等測試框架,確保代碼變更後自動運行測試;4.使用Kubernetes等自動化部署策略,通過deployment.yaml文件定義部署配置;5.優化Dockerfile,採用多階段構

如何搭建獨立PHP任務容器環境 PHP定時腳本運行容器配置方法 如何搭建獨立PHP任務容器環境 PHP定時腳本運行容器配置方法 Jul 25, 2025 pm 07:27 PM

搭建獨立PHP任務容器環境可通過Docker實現,具體步驟如下:1.安裝Docker與DockerCompose作為基礎;2.創建獨立目錄存放Dockerfile、crontab文件;3.編寫Dockerfile定義PHPCLI環境並安裝cron及必要擴展;4.編寫crontab文件定義定時任務;5.編寫docker-compose.yml掛載腳本目錄並配置環境變量;6.啟動容器並驗證日誌。相比Web容器內執行定時任務,獨立容器具備資源隔離、環境純粹、穩定性強、便於擴展等優勢。為確保日誌與錯誤捕

如何用PHP構建日誌管理系統 PHP日誌採集與分析工具 如何用PHP構建日誌管理系統 PHP日誌採集與分析工具 Jul 25, 2025 pm 08:48 PM

選擇日誌記錄方式:初期可用PHP內置error_log(),項目擴大後務必切換至Monolog等成熟庫,支持多handler和日誌級別,確保日誌含時間戳、級別、文件行號及錯誤詳情;2.設計存儲結構:小量日誌可文件存儲,大量或需分析則選數據庫,結構化數據用MySQL/PostgreSQL,半結構化/非結構化推薦Elasticsearch Kibana,同時制定備份與定期清理策略;3.開發分析界面:應具備搜索、過濾、聚合、可視化功能,可直接集成Kibana,或用PHP框架 圖表庫自研,注重界面簡潔易

如何用PHP開發電商後台變現 PHP電商系統架構與盈利策略 如何用PHP開發電商後台變現 PHP電商系統架構與盈利策略 Jul 25, 2025 pm 06:33 PM

1.PHP電商後台主流框架有Laravel(開發快、生態強)、Symfony(企業級、結構穩)、Yii(性能優、適合標準化模塊);2.技術棧需搭配MySQL Redis緩存 RabbitMQ/Kafka消息隊列 Nginx PHP-FPM,並考慮前後端分離;3.高並發架構應分層模塊化、數據庫讀寫分離/分庫分錶、用緩存和CDN加速、異步處理任務、負載均衡與Session共享、逐步微服務化並建立監控告警體系;4.多元變現路徑包括商品差價或平台佣金、站內廣告、SaaS訂閱、定制開發與插件市場、API接

MySQL/Laravel中關係數據的高級條件查詢與過濾 MySQL/Laravel中關係數據的高級條件查詢與過濾 Jul 25, 2025 pm 08:39 PM

本文旨在探討如何在Laravel框架中,利用EloquentORM對關聯數據進行高級條件查詢與過濾,解決在數據庫關係中實現“條件連接”的需求。文章將澄清MySQL中外鍵的實際作用,並詳細講解如何通過Eloquent的with方法結合閉包函數,對預加載的關聯模型應用特定的WHERE子句,從而靈活地篩選出符合條件的相關數據,提升數據檢索的精確性。

優化MySQL用於財務數據存儲 優化MySQL用於財務數據存儲 Jul 27, 2025 am 02:06 AM

MySQL用於金融系統需優化四個關鍵點:1.金融數據必須使用DECIMAL類型確保精度,時間字段使用DATETIME避免時區問題;2.索引設計要合理,避免頻繁更新字段建索引,組合索引按查詢順序排列並定期清理無用索引;3.使用事務確保一致性,控制事務粒度,避免長事務和非核心操作嵌入其中,並根據業務選擇合適隔離級別;4.對歷史數據按時間分區、歸檔冷數據並使用壓縮表,提升查詢效率並優化存儲。

See all articles