国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - mysql8 公用表表達式CTE的使用方法實例分析

mysql8 公用表表達式CTE的使用方法實例分析

2021-01-08 15:33懷素真 Mysql

這篇文章主要介紹了mysql8 公用表表達式CTE的使用方法,結合實例形式分析了mysql8 公用表表達式CTE的基本功能、原理使用方法及相關操作注意事項,需要的朋友可以參考下

本文實例講述了mysql8 公用表表達式cte的使用方法。分享給大家供大家參考,具體如下:

公用表表達式cte就是命名的臨時結果集,作用范圍是當前語句。

說白點你可以理解成一個可以復用的子查詢,當然跟子查詢還是有點區別的,cte可以引用其他cte,但子查詢不能引用其他子查詢。

一、cte的語法格式:

?
1
2
3
4
with_clause:
 with [recursive]
  cte_name [(col_name [, col_name] ...)] as (subquery)
  [, cte_name [(col_name [, col_name] ...)] as (subquery)] ...

二、哪些地方可以使用with語句創建cte

1、select, update,delete 語句的開頭

?
1
2
3
with ... select ...
with ... update ...
with ... delete ...

2、在子查詢的開頭或派生表子查詢的開頭

?
1
2
select ... where id in (with ... select ...) ...
select * from (with ... select ...) as dt ...

3、緊接select,在包含 select聲明的語句之前

?
1
2
3
4
5
6
insert ... with ... select ...
replace ... with ... select ...
create table ... with ... select ...
create view ... with ... select ...
declare cursor ... with ... select ...
explain ... with ... select ...

三、我們先建個表,準備點數據

?
1
2
3
4
5
6
7
create table `menu` (
 `id` int(11) unsigned not null auto_increment comment 'id',
 `name` varchar(32) default '' comment '名稱',
 `url` varchar(255) default '' comment 'url地址',
 `pid` int(11) default '0' comment '父級id',
 primary key (`id`)
) engine=innodb default charset=utf8mb4;

插入點數據:

?
1
2
3
4
5
6
7
insert into `menu` (`id`, `name`, `url`, `pid`) values ('1', '后臺管理', '/manage', '0');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('2', '用戶管理', '/manage/user', '1');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('3', '文章管理', '/manage/article', '1');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('4', '添加用戶', '/manage/user/add', '2');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('5', '用戶列表', '/manage/user/list', '2');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('6', '添加文章', '/manage/article/add', '3');
insert into `menu` (`id`, `name`, `url`, `pid`) values ('7', '文章列表', '/manage/article/list', '3');

mysql8 公用表表達式CTE的使用方法實例分析

四、非遞歸cte

這里查詢每個菜單對應的直接上級名稱,通過子查詢的方式。

?
1
select m.*, (select name from menu where id = m.pid) as pname from menu as m;

這里換成用cte完成上面的功能

?
1
2
3
4
with cte as (
 select * from menu
)
select m.*, (select cte.name from cte where cte.id = m.pid) as pname from menu as m;

上面的示例并不是很好,只是用來演示cte的使用。你只需要知道 cte 就是一個可復用的結果集就好了。

相比較某些子查詢,cte 的效率會更高,因為非遞歸的 cte 只會查詢一次并復用。

cte 可以引用其他 cte 的結果,比如下面的語句,cte2 就引用了 cte1 中的結果。

?
1
2
3
4
5
6
with cte1 as (
 select * from menu
), cte2 as (
 select m.*, cte1.name as pname from menu as m left join cte1 on m.pid = cte1.id
)
select * from cte2;

 五、遞歸cte

遞歸cte是一種特殊的cte,其子查詢會引用自身,with子句必須以 with recursive 開頭。

cte遞歸子查詢包括兩部分:seed 查詢 和 recursive 查詢,中間由union [all] 或 union distinct 分隔。

seed 查詢會被執行一次,以創建初始數據子集。

recursive 查詢會被重復執行以返回數據子集,直到獲得完整結果集。當迭代不會生成任何新行時,遞歸會停止。

?
1
2
3
4
5
6
with recursive cte(n) as (
 select 1
 union all
 select n + 1 from cte where n < 10
)
select * from cte;

上面的語句,會遞歸顯示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
2
3
4
5
6
with recursive cte as (
 select id, name, cast('0' as char(255)) as path from menu where pid = 0
 union all
 select menu.id, menu.name, concat(cte.path, ',', cte.id) as path from menu inner join cte on menu.pid = cte.id
)
select * from cte;

 mysql8 公用表表達式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、直到沒有返回任何行時,遞歸停止。

查詢一個指定菜單所有的父級菜單

?
1
2
3
4
5
6
with recursive cte as (
 select id, name, pid from menu where id = 7
 union all
 select menu.id, menu.name, menu.pid from menu inner join cte on cte.pid = menu.id
)
select * from cte;

mysql8 公用表表達式CTE的使用方法實例分析

希望本文所述對大家MySQL數據庫計有所幫助。

原文鏈接:https://www.cnblogs.com/jkko123/p/10176323.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 这里只有精品在线视频观看 | 国内精品视频 | 欧美视频精品 | 欧美二三区| 日韩在线观看中文字幕 | 亚洲视频免费 | 久久综合激情 | 成人刺激视频在线 | 永久免费在线 | 国产精品一区二区三区在线播放 | 精品一区二区三区免费视频 | 日韩成人在线看 | 综合在线视频 | 亚洲一区在线播放 | 精品成人国产在线观看男人呻吟 | 久久久精品免费视频 | 久久久久久九九 | 草草视频在线观看 | 成人在线播放 | 亚洲精品一区在线 | 色婷婷狠狠| 欧美 日韩 综合 | 欧美综合一区 | 国产精品成人国产乱一区 | 精品国产一区二区三区久久久 | 中文字幕第33页 | 国产精品亚洲成在人线 | 欧美午夜在线观看 | 99伊人网| 久久这里有精品视频 | 欧美亚洲一区二区三区 | 久草一区 | 色www精品视频在线观看 | 午夜视频在线观看网站 | 欧美午夜精品久久久 | 亚洲在线视频一区 | 91在线视频观看 | 成人网视频在线观看 | 婷婷久久五月天 | 奇米亚洲午夜久久精品 | 在线视频二区 |