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