MySQL-8 公用表表達式CTE的使用方法實例分析


公用表表達式CTE就是命名的臨時結果集,作用范圍是當前語句。

說白了,你可以把它理解成一個可以多次重復使用的子查詢,當然跟子查詢還是有點區別的,CTE可以引用其他CTE,但子查詢不能引用其他子查詢。

MySQL 8.0版以來簡要介紹了公共表表達式或叫CTE的功能,因此需要您在計算機上安裝MySQL 8.0,因此以下語句僅適合在 MySQL8.0 以上版本。

一、CTE 表達式

1、CTE的結構包括名稱,可選列列表和定義CTE的查詢。 定義CTE后,可以像SELECTINSERTUPDATEDELETECREATE VIEW語句中的視圖一樣使用它。

以下說明了CTE的基本語法:

WITH cte_name (column_list) AS (
    query
) 
SELECT * FROM cte_name;
請注意,查詢中的列數必須與 column_list中的列數相同。 如果省略 column_listCTE將使用定義 CTE的查詢的列列表。

2、簡單的MySQL CTE示例

ITH customers_in_usa AS (
    SELECT 
        customerName, state
    FROM
        customers
    WHERE
        country = 'USA'
) SELECT 
    customerName
 FROM
    customers_in_usa
 WHERE
    state = 'CA'
 ORDER BY customerName;

參見另外一個例子:

WITH topsales2013 AS (
    SELECT 
        salesRepEmployeeNumber employeeNumber,
        SUM(quantityOrdered * priceEach) sales
    FROM
        orders
            INNER JOIN
        orderdetails USING (orderNumber)
            INNER JOIN
        customers USING (customerNumber)
    WHERE
        YEAR(shippedDate) = 2013
            AND status = 'Shipped'
    GROUP BY salesRepEmployeeNumber
    ORDER BY sales DESC
    LIMIT 5
)
SELECT 
    employeeNumber, firstName, lastName, sales
FROM
    employees
        JOIN topsales2013 USING (employeeNumber);
在這個例子中, CTE中返回了在 2013年前五名的銷售代表。之后,我們引用了 topsales2013 CTE來獲取有關銷售代表的其他信息,包括名字和姓氏。

3. 更高級的MySQL CTE示例

WITH salesrep AS (
    SELECT 
        employeeNumber,
        CONCAT(firstName, ' ', lastName) AS salesrepName
    FROM
        employees
    WHERE
        jobTitle = 'Sales Rep'
),
customer_salesrep AS (
    SELECT 
        customerName, salesrepName
    FROM
        customers
            INNER JOIN salesrep ON employeeNumber = salesrepEmployeeNumber
)
SELECT 
    *
FROM customer_salesrep ORDER BY customerName;

在這個例子中,在同一查詢中有兩個CTE。 第一個CTE(salesrep)獲得職位是銷售代表的員工。 第二個CTE(customer_salesrep)使用INNER JOIN子句與第一個CTE連接來獲取每個銷售代表負責的客戶。

在使用第二個CTE之后,使用帶有ORDER BY子句的簡單SELECT語句來查詢來自該CTE的數據。

以上是一些簡單的使用。還有其他的使用方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM