非递归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;
网友评论