公用表表示式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示例
with
customers_in_usaas(
select
customername
,state
from
customers
where
country
='usa'
)select
customername
from
customers_in_usa
where
state
='ca'
order
bycustomername
;
參見另外乙個例子:
with
topsales2013as(
select
salesrepemployeenumber
employeenumber
,sum
(quantityordered
*priceeach
)sales
from
orders
inner
join
orderdetails
using
(ordernumber
)inner
join
customers
using
(customernumber
)where
year
(shippeddate)=
2013
andstatus
='shipped'
group
bysalesrepemployeenumber
order
bysales
desc
limit5)
select
employeenumber
,firstname
,lastname
,sales
from
employees
join
topsales2013
using
(employeenumber
);
3. 更高階的mysql cte示例
with
salesrepas(
select
employeenumber
,concat
(firstname
,' '
,lastname)as
salesrepname
from
employees
where
jobtitle
='sales rep'),
customer_salesrepas(
select
customername
,salesrepname
from
customers
inner
join
salesrep
onemployeenumber
=salesrepemployeenumber
)select
*from
customer_salesrep
order
bycustomername
;
在這個例子中,在同一查詢中有兩個cte。 第乙個**cte(salesrep)獲得職位是銷售代表的員工。 第二個cte(customer_salesrep)**使用inner join子句與第乙個cte連線來獲取每個銷售代表負責的客戶。
在使用第二個cte之後,使用帶有order by子句的簡單select語句來查詢來自該cte的資料。
以上是一些簡單的使用。還有其他的使用方式。
mysql8 WITH AS(公用表表示式)
公用表表示式 cte 是乙個命名的臨時結果集,它存在於單個語句的範圍內,以後可以在該語句中引用,可能多次。以下討論描述了如何編寫使用cte的語句。要指定公用表表示式,請使用 with具有乙個或多個逗號分隔子句的子句。每個子句都提供乙個子查詢,該子查詢產生乙個結果集,並將乙個名稱與該子查詢相關聯。下面...
公用表表示式
公用表表示式 common table expressions 假設我們有乙個100w條資料的訂單表,需要分頁查詢。declare rownumber asint,pagenumber asint set rownumber 5 set pagenumber 2 with orderedorders...
公用表表示式CTE
公用表表示式cte表面上和派生表非常相似,看起來只是語義上的區別。但和派生表比較起來,cte具有幾個優勢 第一,如果須要在乙個cte中引用另乙個cte,不需要像派生表那樣巢狀,相反,只要簡單地在同乙個with子句中定義多個cte,並用逗號把它們分隔開。每個cte可以引用在它前面定義的所有cte。而外...