最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL CTE (Common Table Expressions)示例全解析

 更新時(shí)間:2025年07月26日 10:36:54   作者:Full Stack Developme  
MySQL 8.0引入CTE,支持遞歸查詢,可創(chuàng)建臨時(shí)命名結(jié)果集,提升復(fù)雜查詢的可讀性與維護(hù)性,適用于層次結(jié)構(gòu)數(shù)據(jù)處理,但需注意性能和遞歸深度限制,本文給大家介紹MySQL CTE (Common Table Expressions)示例,感興趣的朋友一起看看吧

CTE (Common Table Expression,公共表表達(dá)式) 是 MySQL 8.0 引入的重要特性,它允許在查詢中創(chuàng)建臨時(shí)命名結(jié)果集,提高復(fù)雜查詢的可讀性和可維護(hù)性。

基本語法

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

CTE 主要特點(diǎn)

  • 臨時(shí)結(jié)果集:只在查詢執(zhí)行期間存在
  • 可引用性:可以在主查詢中多次引用
  • 可讀性強(qiáng):比嵌套子查詢更易理解
  • 遞歸支持:支持遞歸查詢(MySQL 8.0+)

非遞歸 CTE

簡單 CTE 示例

WITH department_stats AS (
    SELECT 
        department_id, 
        COUNT(*) as employee_count,
        AVG(salary) as avg_salary
    FROM employees
    GROUP BY department_id
)
SELECT 
    d.department_name,
    ds.employee_count,
    ds.avg_salary
FROM departments d
JOIN department_stats ds ON d.department_id = ds.department_id;

多 CTE 示例

WITH 
high_earners AS (
    SELECT * FROM employees WHERE salary > 100000
),
it_employees AS (
    SELECT * FROM employees WHERE department_id = 10
)
SELECT 
    h.employee_id,
    h.name,
    'High Earner' as category
FROM high_earners h
UNION ALL
SELECT 
    i.employee_id,
    i.name,
    'IT Employee' as category
FROM it_employees i;

遞歸 CTE

遞歸 CTE 可以處理層次結(jié)構(gòu)數(shù)據(jù),如組織結(jié)構(gòu)、評論樹等。

基本遞歸 CTE 結(jié)構(gòu)

WITH RECURSIVE cte_name AS (
    -- 基礎(chǔ)部分(種子查詢)
    SELECT ... WHERE ...
    UNION [ALL]
    -- 遞歸部分
    SELECT ... FROM cte_name JOIN ...
    WHERE ...
)
SELECT * FROM cte_name;

遞歸 CTE 示例:組織結(jié)構(gòu)查詢

WITH RECURSIVE org_hierarchy AS (
    -- 基礎(chǔ)部分:查找頂級管理者
    SELECT 
        employee_id,
        name,
        manager_id,
        1 as level
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    -- 遞歸部分:查找下屬員工
    SELECT 
        e.employee_id,
        e.name,
        e.manager_id,
        oh.level + 1
    FROM employees e
    JOIN org_hierarchy oh ON e.manager_id = oh.employee_id
)
SELECT * FROM org_hierarchy ORDER BY level, employee_id;

遞歸 CTE 示例:生成序列

WITH RECURSIVE number_sequence AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM number_sequence WHERE n < 10
)
SELECT * FROM number_sequence;

CTE 的優(yōu)勢

  • 提高可讀性:將復(fù)雜查詢分解為邏輯塊
  • 避免重復(fù):可以多次引用同一個(gè)CTE
  • 替代視圖:不需要?jiǎng)?chuàng)建永久視圖
  • 遞歸能力:處理層次結(jié)構(gòu)數(shù)據(jù)
  • 更好的優(yōu)化:MySQL優(yōu)化器能更好處理CTE

CTE 與派生表的比較

特性CTE派生表
可讀性
可重用性可在查詢中多次引用每次使用都需要重新定義
遞歸支持支持不支持
性能通常更好可能較差
語法清晰度更清晰嵌套較深時(shí)難以理解

實(shí)際應(yīng)用場景

  • 數(shù)據(jù)報(bào)表:構(gòu)建復(fù)雜報(bào)表的多步數(shù)據(jù)處理
WITH 
monthly_sales AS (
    SELECT 
        DATE_FORMAT(order_date, '%Y-%m') as month,
        SUM(amount) as total_sales
    FROM orders
    GROUP BY month
),
growth_rate AS (
    SELECT 
        month,
        total_sales,
        LAG(total_sales) OVER (ORDER BY month) as prev_sales,
        (total_sales - LAG(total_sales) OVER (ORDER BY month)) / 
        LAG(total_sales) OVER (ORDER BY month) * 100 as growth_pct
    FROM monthly_sales
)
SELECT * FROM growth_rate;
  • 數(shù)據(jù)清洗:多步數(shù)據(jù)轉(zhuǎn)換
WITH 
raw_data AS (
    SELECT * FROM source_table WHERE quality_check = 1
),
cleaned_data AS (
    SELECT 
        id,
        TRIM(name) as name,
        CASE WHEN age < 0 THEN NULL ELSE age END as age
    FROM raw_data
)
SELECT * FROM cleaned_data;
  • 路徑查找:圖數(shù)據(jù)查詢
WITH RECURSIVE path_finder AS (
    SELECT 
        start_node as path,
        start_node,
        end_node,
        1 as length
    FROM graph
    WHERE start_node = 'A'
    UNION ALL
    SELECT 
        CONCAT(pf.path, '->', g.end_node),
        g.start_node,
        g.end_node,
        pf.length + 1
    FROM graph g
    JOIN path_finder pf ON g.start_node = pf.end_node
    WHERE FIND_IN_SET(g.end_node, REPLACE(pf.path, '->', ',')) = 0
)
SELECT * FROM path_finder;

性能考慮

  • 物化:MySQL可能會(huì)物化CTE結(jié)果
  • 遞歸深度:默認(rèn)遞歸深度限制為1000,可通過cte_max_recursion_depth參數(shù)調(diào)整
SET SESSION cte_max_recursion_depth = 2000;
  • 優(yōu)化器提示:可以使用提示影響CTE處理
WITH cte_name AS (
    SELECT /*+ MERGE() */ * FROM table_name
)
SELECT * FROM cte_name;

限制

  • MySQL 8.0 之前版本不支持CTE
  • 某些復(fù)雜遞歸查詢可能有性能問題
  • 在存儲(chǔ)過程和函數(shù)中使用有限制

CTE是MySQL中處理復(fù)雜查詢的強(qiáng)大工具,合理使用可以顯著提高SQL代碼的可讀性和維護(hù)性。

到此這篇關(guān)于MySQL CTE (Common Table Expressions) 詳解的文章就介紹到這了,更多相關(guān)mysql cte內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 定位和優(yōu)化mysql慢查詢的常見方法分享

    定位和優(yōu)化mysql慢查詢的常見方法分享

    MySQL中的慢查詢(Slow Query)指執(zhí)行時(shí)間超過指定閾值的查詢語句,默認(rèn)閾值是long_query_time參數(shù)設(shè)置的秒值,MySQL有幾種常見的方法可以發(fā)現(xiàn)和獲取慢查詢,接下來小編將給大家詳細(xì)的介紹一下這些方法,需要的朋友可以參考下
    2023-08-08
  • CentOS7.5 安裝 Mysql8.0.19的教程圖文詳解

    CentOS7.5 安裝 Mysql8.0.19的教程圖文詳解

    這篇文章主要介紹了CentOS7.5 安裝 Mysql8.0.19的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫密碼

    如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫密碼

    這篇文章主要介紹了如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫密碼問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 刪除mysql數(shù)據(jù)表如何操作

    刪除mysql數(shù)據(jù)表如何操作

    在本篇文章里小編給大家分享了關(guān)于刪除mysql數(shù)據(jù)表簡單方法,需要的朋友們可以參考學(xué)習(xí)下。
    2020-06-06
  • Centos?7.9安裝MySQL8.0.32的詳細(xì)教程

    Centos?7.9安裝MySQL8.0.32的詳細(xì)教程

    這篇文章主要介紹了Centos7.9安裝MySQL8.0.32的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • MySql狀態(tài)查看方法 MySql如何查看連接數(shù)和狀態(tài)?

    MySql狀態(tài)查看方法 MySql如何查看連接數(shù)和狀態(tài)?

    如果是root帳號(hào),你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號(hào),只能看到自己占用的連接
    2012-11-11
  • mysql中的日期相減的天數(shù)函數(shù)

    mysql中的日期相減的天數(shù)函數(shù)

    這篇文章主要介紹了mysql中的日期相減的天數(shù)函數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • InnoDB存儲(chǔ)引擎中的表空間詳解

    InnoDB存儲(chǔ)引擎中的表空間詳解

    這篇文章主要介紹了InnoDB存儲(chǔ)引擎中的表空間詳解,表空間內(nèi)部,所有頁按照區(qū)extent為物理單元進(jìn)行劃分和管理,extent由64個(gè)物理連續(xù)的頁組成,表空間可以理解為由一個(gè)個(gè)物理相鄰的extent組成,需要的朋友可以參考下
    2023-09-09
  • MySQL數(shù)據(jù)庫簡介與基本操作

    MySQL數(shù)據(jù)庫簡介與基本操作

    這篇文章介紹了MySQL數(shù)據(jù)庫與其基本操作,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • MySQL性能瓶頸排查定位實(shí)例詳解

    MySQL性能瓶頸排查定位實(shí)例詳解

    這篇文章主要介紹了MySQL性能瓶頸排查定位的方法,結(jié)合實(shí)例形式詳細(xì)分析了MySQL排查性能瓶頸問題的步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-04-04

最新評論

方山县| 泽州县| 上犹县| 湖南省| 灵山县| 武汉市| 江口县| 宁城县| 青龙| 西乡县| 廉江市| 灵寿县| 西昌市| 宿州市| 长泰县| 定陶县| 荥阳市| 镇宁| 屯留县| 报价| 吐鲁番市| 梁平县| 阳江市| 浦城县| 双柏县| 江山市| 灌阳县| 玉树县| 思茅市| 洞口县| 宝鸡市| 延津县| 文昌市| 玉田县| 英德市| 曲靖市| 遵化市| 巴彦县| 长寿区| 崇明县| 江西省|