mysql8 WITH AS(公用表表示式)

2022-09-05 06:36:11 字數 2758 閱讀 1534

公用表表示式(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 浮點...