在介紹recursive common table expression之前,我們先來認(rèn)識一下什么是common table expression礁遣。
Common Table Expressions
在MySQL :: MySQL 8.0 Reference Manual :: 13.2.15 WITH (Common Table Expressions)中祟霍,它對common table expression (CTE)的解釋如下:
A common table expression (CTE) is a named temporary result set that exists within the scope of a single statement and that can be referred to later within that statement, possibly multiple times.
一個common table expression (CTE)是一個擁有名稱的臨時結(jié)果集盈包,它存在于一條語句的范圍之內(nèi)大州,它之后能被那條語句引用垂谢。
我們先看一個例子:
WITH cte (col1, col2) AS
(
SELECT 1, 2
)
SELECT col1, col2 FROM cte;
上面的例子中,你使用with子句定義了一個名叫cte的CTE根暑,它擁有(col1, col2)
兩列,它只擁有(1, 2)
這一行數(shù)據(jù)排嫌。之后的SELECT
語句就能夠使用這個CTE了缰犁。執(zhí)行上述語句的結(jié)果如下:
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
+------+------+
Recursive Common Table Expressions
介紹完CTE后,我們來看看recursive CTE是怎樣的颇象。
recursive CTE的子查詢包含兩部分并徘,通過UNION [ALL]
或者UNION DISTINCT
分割。就像下面一樣:
SELECT ... -- return initial row set
UNION ALL
SELECT ... -- return additional row sets
第一個SELECT
為CTE產(chǎn)生初始行集蕴茴,并且不會引用CTE的名稱姐直。第二個SELECT
產(chǎn)生額外的行集,并且通過在它的FROM子句中引用CTE的名稱遞歸晃听,當(dāng)不再產(chǎn)生新的行時砰识,遞歸中止辫狼。遞歸的每次迭代只操作上一次迭代所產(chǎn)生的行。
讓我們來看一個例子來更好地理解膨处。
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
# 執(zhí)行結(jié)果如下:
+------+
| n |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
我們來分析一下為什么會得到這樣的結(jié)果。首先SELECT 1
會產(chǎn)生初始化行集鹃答,此時,cte
所代表的結(jié)果集只有一行數(shù)據(jù)置济。接下來會開始第二個SELECT
的遞歸锋八。第一次迭代會操作初始化行集(1)
并產(chǎn)生(2)
,第二次迭代會第一次迭代產(chǎn)生的行集(2)
并產(chǎn)生(3)
羞酗,一直這樣下去檀轨,知道遞歸中止欺嗤,也就是n
不再小于5
時。
這里其實只是簡單的介紹了CTE和recursive CTE剂府,想了解更多的話還是建議去查看官方文檔腺占。