- sql自学笔记(十七)——MySQL8.0版本的新特性(七)
- sql自学笔记(二十七)——MySQL8.0版本的新特性(十七)
- sql自学笔记(十一)——MySQL8.0版本的新特性(一)
- sql自学笔记(十二)——MySQL8.0版本的新特性(二)
- sql自学笔记(十九)——MySQL8.0版本的新特性(九)
- sql自学笔记(十三)——MySQL8.0版本的新特性(三)
- sql自学笔记(十四)——MySQL8.0版本的新特性(四)
- sql自学笔记(十五)——MySQL8.0版本的新特性(五)
- sql自学笔记(十六)——MySQL8.0版本的新特性(六)
- sql自学笔记(十八)——MySQL8.0版本的新特性(八)
非递归CTE
MySQL8.0开始支持通用表达式(CTE),即WITH子句。
派生表 | 通用表达式 |
---|---|
SELECT * FROM(SELECT 1)AS dt; | WITH cte AS (SELECT 1) SELECT * FROM cte; |
在8.0中关于非递归CTE的使用
先查看一下使用的派生表
select * from (select 1) as dt;

使用通用表表达式如何实现相应的功能
with dt as (select 1)
->select * from dt;

cte的另外一个功能
with cte1(id) as(select 1),
->(cte 2(id) as (select id+1 from cte1))
->select * from cte1 join cte2;

好处:前面定义好的通用表变量可以拿到后面使用
递归CTE
递归CTE在查询中引用自己的定义,使用RECURSLVE表示
例:
WITH RECURSIVE cte(n)AS #表示他是一个递归形式的cte
(
SELECT 1 #递归的初始化语句
UNION ALL
SELECT n+1 FROM cte WHERE n<5 #cte表示通用表表达式本身
)
SELECT * FROM cte;

在8.0中递归的cte的使用
首先演示一下生成数字序列的效果


使用递归调用表表达式如何查询员工表它的上下级关系
select * from employees order by id;

展示一下员工从上至下的管理关系
with recarsive employee _paths(id,name,path)as
->(
->select id,name,cast(id as char(200))
->from employees
->where manger_id is null
->union all
->select e.id,e.name,concat(ep path,',',e.id)
->from employee_paths as ep join employees ase
->on ep.id = e.manager_id
->)
->select * from employee _ paths order by path;

网友评论