mysql cte 语法,mysql8 公用表表达式CTE的使用方法实例分析
本文實(shí)例講述了mysql8 公用表表達(dá)式cte的使用方法。分享給大家供大家參考,具體如下:
公用表表達(dá)式cte就是命名的臨時結(jié)果集,作用范圍是當(dāng)前語句。
說白點(diǎn)你可以理解成一個可以復(fù)用的子查詢,當(dāng)然跟子查詢還是有點(diǎn)區(qū)別的,cte可以引用其他cte,但子查詢不能引用其他子查詢。
一、cte的語法格式:
二、哪些地方可以使用with語句創(chuàng)建cte
1、select, update,delete 語句的開頭
2、在子查詢的開頭或派生表子查詢的開頭
3、緊接select,在包含 select聲明的語句之前
三、我們先建個表,準(zhǔn)備點(diǎn)數(shù)據(jù)
插入點(diǎn)數(shù)據(jù):
四、非遞歸cte
這里查詢每個菜單對應(yīng)的直接上級名稱,通過子查詢的方式。
這里換成用cte完成上面的功能
上面的示例并不是很好,只是用來演示cte的使用。你只需要知道 cte 就是一個可復(fù)用的結(jié)果集就好了。
相比較某些子查詢,cte 的效率會更高,因為非遞歸的 cte 只會查詢一次并復(fù)用。
cte 可以引用其他 cte 的結(jié)果,比如下面的語句,cte2 就引用了 cte1 中的結(jié)果。
五、遞歸cte
遞歸cte是一種特殊的cte,其子查詢會引用自身,with子句必須以 with recursive 開頭。
cte遞歸子查詢包括兩部分:seed 查詢 和?recursive 查詢,中間由union [all] 或 union distinct 分隔。
seed 查詢會被執(zhí)行一次,以創(chuàng)建初始數(shù)據(jù)子集。
recursive 查詢會被重復(fù)執(zhí)行以返回數(shù)據(jù)子集,直到獲得完整結(jié)果集。當(dāng)?shù)粫扇魏涡滦袝r,遞歸會停止。
上面的語句,會遞歸顯示10行,每行分別顯示1-10數(shù)字。
遞歸的過程如下:
1、首先執(zhí)行 select 1 得到結(jié)果 1, 則當(dāng)前 n 的值為 1。
2、接著執(zhí)行 select n + 1 from cte where n < 10,因為當(dāng)前 n 為 1,所以where條件成立,生成新行,select n + 1 得到結(jié)果 2,則當(dāng)前 n 的值為 2。
3、繼續(xù)執(zhí)行?select n + 1 from cte where n < 10,因為當(dāng)前 n 為 2,所以where條件成立,生成新行,select n + 1 得到結(jié)果 3,則當(dāng)前 n 的值為 3。
4、一直遞歸下去
5、直到當(dāng) n 為 10 時,where條件不成立,無法生成新行,則遞歸停止。
對于一些有上下級關(guān)系的數(shù)據(jù),通過遞歸cte就可以很好的處理了。
比如我們要查詢每個菜單到頂級菜單的路徑
遞歸的過程如下:
1、首先查詢出所有 pid = 0 的菜單數(shù)據(jù),并設(shè)置path 為 '0',此時cte的結(jié)果集為 pid = 0 的所有菜單數(shù)據(jù)。
2、執(zhí)行 menu inner join cte on menu.pid = cte.id ,這時表 menu 與 cte (步驟1中獲取的結(jié)果集) 進(jìn)行內(nèi)連接,獲取菜單父級為頂級菜單的數(shù)據(jù)。
3、繼續(xù)執(zhí)行?menu inner join cte on menu.pid = cte.id,這時表 menu 與 cte (步驟2中獲取的結(jié)果集) 進(jìn)行內(nèi)連接,獲取菜單父級的父級為頂級菜單的數(shù)據(jù)。
4、一直遞歸下去
5、直到?jīng)]有返回任何行時,遞歸停止。
查詢一個指定菜單所有的父級菜單
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
原文鏈接:https://www.cnblogs.com/jkko123/p/10176323.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的mysql cte 语法,mysql8 公用表表达式CTE的使用方法实例分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php制作标签,ThinkPHP标签制作
- 下一篇: mysql查询时给字段加内容,mysql