公用表表示式(cte)是乙個命名的臨時結果集,它存在於單個語句的範圍內,以後可以在該語句中引用,可能多次。以下討論描述了如何編寫使用cte的語句。
要指定公用表表示式,請使用 with具有乙個或多個逗號分隔子句的子句。每個子句都提供乙個子查詢,該子查詢產生乙個結果集,並將乙個名稱與該子查詢相關聯。下面的示例定義名為的cte cte1和cte2中 with子句,並且是指在它們的頂層select下面的with子句:
with
cte1 as
(select a, b from table1)
, cte2 as
(select c, d from table2)
select b, d from cte1 join cte2
where cte1.a = cte2.c;
確定給定cte的列名的過程如下:
如果帶括號的名稱列表位於cte名稱之後,則這些名稱為列名稱:
with cte (col1, col2)as(
select1,
2union
allselect3,
4)select col1, col2 from cte;
否則,列名來自首的選擇列表中select的內 部分: as (subquery)
with cte as
(select
1as col1,
2as col2
union
allselect3,
4)select col1, col2 from cte;
with同一級別 僅允許乙個子句。不允許在同一級別with後面跟隨with,因此這是非法的:
with cte1 as(.
..)with cte2 as(.
..)select..
.
為了使該語句合法,請使用單個 with子句以逗號分隔各子句:
with cte1 as(.
..), cte2 as(.
..)select..
.
但是,乙個語句可以包含多個 with子句(如果它們出現在不同的級別):
with cte1 as
(select1)
select
*from
(with cte2 as
(select2)
select
*from cte2 join cte1)
as dt;
遞迴公用表表示式是具有引用其自身名稱的子查詢的表示式。例如:
with recursive cte (n)as(
select
1union
allselect n +
1from cte where n <5)
select
*from cte;
對於遞迴cte,重要的是遞迴 select部分包括終止遞迴的條件。作為一種防止遞迴cte失控的開發技術,您可以通過限制執行時間來強制終止:
set
session cte_max_recursion_depth =
1000000
;-- permit deeper recursion
set max_execution_time =
1000
;-- impose one second timeout
with recursive cte (n)as(
select
1union
allselect n +
1from cte
)select
/*+ max_execution_time(1000) */
*from cte;
斐波那契數列生成
斐波那契數列以兩個數字0和1(或1和1)開始,其後的每個數字是前兩個數字的和。如果遞迴產生的每一行都select可以訪問該序列中的前兩個數字,則遞迴公用表表示式可以生成斐波那契數列 。以下cte使用0和1作為前兩個數字來生成10數序列:
with recursive fibonacci (n, fib_n, next_fib_n)as(
select1,
0,1union
allselect n +
1, next_fib_n, fib_n + next_fib_n
from fibonacci where n <10)
select
*from fibonacci;
cte產生以下結果:
+
------+-------+------------+
| n | fib_n | next_fib_n |
+------+-------+------------+|1
|0|1
||2|
1|1|
|3|1
|2||
4|2|
3||5
|3|5
||6|
5|8|
|7|8
|13||
8|13|
21||9
|21|34
||10|
34|55|
+------+-------+------------+
11 MySQL 8 公用表表示式CTE的使用分析
公用表表示式cte就是命名的臨時結果集,作用範圍是當前語句。說白了,你可以把它理解成乙個可以多次重複使用的子查詢,當然跟子查詢還是有點區別的,cte可以引用其他cte,但子查詢不能引用其他子查詢。自mysql 8.0版以來簡要介紹了公共表表示式或叫cte的功能,因此需要您在計算機上安裝mysql 8...
MySQL閱讀筆記 8 表訪問
全表掃瞄 使用索引查詢 針對主鍵或唯一二級索引等值查詢 針對普通二級索引等值查詢 針對索引列範圍查詢 in子句也可以劃分為範圍查詢 掃瞄整個索引列 即使訪問通過索引列查詢資料,也不一定會使用索引,當mysql優化器判斷查詢二級索引 回表的代價比全表掃瞄小的時候才會使用索引,如果有大量回表操作,執行隨...
MySQL筆記8 表的建立 增刪改
二 向表中插入資料 三 複製表 按照查詢結果建立新錶 四 將查詢結果插入一張表中 五 修改表中的資料 六 刪除表中的資料 七 刪除一整張表 語法 creat table 表名 資料型別 占用位元組數 說明int 4位元組整型 bigint 8位元組長整型,類似long float double 浮點...