公用表表達式CTE就是命名的臨時結果集,作用范圍是當前語句。
說白了,你可以把它理解成一個可以多次重復使用的子查詢,當然跟子查詢還是有點區別的,CTE可以引用其他CTE,但子查詢不能引用其他子查詢。
自MySQL 8.0版以來簡要介紹了公共表表達式或叫CTE的功能,因此需要您在計算機上安裝MySQL 8.0,因此以下語句僅適合在 MySQL8.0 以上版本。
一、CTE 表達式
1、CTE的結構包括名稱,可選列列表和定義CTE的查詢。 定義CTE后,可以像SELECT
,INSERT
,UPDATE
,DELETE
或CREATE VIEW
語句中的視圖一樣使用它。
以下說明了CTE的基本語法:
WITH cte_name (column_list) AS ( query ) SELECT * FROM cte_name;
請注意,查詢中的列數必須與
column_list
中的列數相同。 如果省略
column_list
,
CTE將使用定義
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的數據。
以上是一些簡單的使用。還有其他的使用方式。