sql自学笔记(十七)——MySQL8.0版本的新特性(七)

2019-05-05  本文已影响0人  itczt

非递归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;
上一篇下一篇

猜你喜欢

热点阅读