認(rèn)識MySQL的recursive common table expression

在介紹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剂府,想了解更多的話還是建議去查看官方文檔腺占。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铡羡,隨后出現(xiàn)的幾起案子烦周,更是在濱河造成了極大的恐慌怎顾,老刑警劉巖读慎,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夭委,死亡現(xiàn)場離奇詭異株灸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慌烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門厕氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腐巢,你說我怎么就攤上這事玄括∪馔撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵哪雕,是天一觀的道長斯嚎。 經(jīng)常有香客問我挨厚,道長堡僻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任疫剃,我火速辦了婚禮钉疫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巢价。我一直安慰自己牲阁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布壤躲。 她就那樣靜靜地躺著城菊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碉克。 梳的紋絲不亂的頭發(fā)上凌唬,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音棉胀,去河邊找鬼法瑟。 笑死冀膝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窝剖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼起胰!你這毒婦竟也來了效五?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤婆廊,失蹤者是張志新(化名)和其女友劉穎否彩,沒想到半個月后敬尺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砂吞,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了压储。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖傻工,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泄伪,我是刑警寧澤蟋滴,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布尔苦,位于F島的核電站允坚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏皿渗。R本人自食惡果不足惜划乖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一迷殿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懦尝,春花似錦陵霉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则披。三九已至士复,卻和暖如春阱洪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背利耍。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工蚌本, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人程癌。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓烦秩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兜蠕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354