cte 公用表表示式(通用表表示式)
common table expression 簡稱cte
先放操作
# 使用的資料表和資料(測試) 使用的mysql8.0.16
create table `menu` (
`id` int(10) unsigned not null auto_increment comment '選單id',
`menu_name` varchar(32) character set utf8mb4 collate utf8mb4_general_ci not null default '' comment '選單名稱',
`pid` int(10) unsigned not null default '0' comment '上級id',
primary key (`id`)
) engine=innodb auto_increment=4 default charset=utf8mb4 collate=utf8mb4_general_ci comment='選單表';
insert into `menu` values ('1', '一級選單', '0');
insert into `menu` values ('2', '二級選單', '1');
insert into `menu` values ('3', '**選單', '2');
# 操作起來 (關鍵字沒有大小寫,看不慣的自己美化下)
# 獲取 一級選單 的所有下級選單id
# 之前需要**中遞迴,這裡直接在sql語句處理 好不好用了才知道 效率說句話沒有怎麼測試
# 這裡也使用的是 遞迴,mysql cte的遞迴with recursive r as(select id from menu where id=1
union all
select m.id from menu as m, r where r.id =m.pid)
select id from r;
結果如下
| id |
| 1 |
| 2 |
| 3 |
既然可以獲取下級的,那能不能獲取上級的,答案是肯定
# 獲取 **選單的所有上級
with recursive r as (
select pid from menu where id = 3
union all
select m.pid from menu as m
,r where r.pid = m.id
) select pid from r where pid!=0;
#結果如下
| pid |
| 2 |
| 1 |
上面使用的就是 mysql8版本之後的 cte
公用表表示式是乙個命名的臨時結果集,僅在單個sql語句(例如select、insert、delete和update)的執行範圍內存在。
cte分為遞迴cte和非遞迴cte。
【cte的語法格式】
cte的主要思想就先生成臨時結果集,以方便後面的使用;與臨時表不同的是這個結果集的作用域不是當前session而是當前語句,對!不是session級是語句級別的
with_clause:with [recursive]cte_name[(col_name [, col_name] ...)] as(subquery)[, cte_name [(col_name [, col_name] ...)] as (subquery)] ...
mysql有top嗎 mysql有top查詢嗎
用慣了access mssql server的朋友,可能在用mysql查詢前n條記錄時,習慣的使用select top n 形式的語句,在這裡說明一下,mysql沒有此語法,mysql用limit來實現相關功能,而且功能更加強大,good。以下是limit在mysql中的使用詳解 語法 select...
mysql有top嗎 mysql有top查詢嗎
在mysql中沒有top查詢,但是可以使用limit限制查詢來實現相同的效果,語法為 select from table limit offset,rows rows offset offset 用慣了access mssql server的朋友,可能在用mysql查詢前n條記錄時,習慣的使用sel...
mysql有必要公升級8嗎
mysql有必要公升級到第8版本,相較於之前的版本,mysql8增加多種新特性,同時也提高了軟體各方面的速度。除此之外,mysql8還增加了開窗函式,可以讓使用者獲得更好的使用體驗。mysql有必要公升級到第8版本,相較於之前的版本,mysql8增加多種新特性,同時也提高了軟體各方面的速度。除此之外...