mysql 8.0 递归(例子分享)(sample database classicmodels _No.4)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文介绍了如何在MySQL8.0中使用递归查询处理部门表和员工表的树形结构数据,包括查看文档、准备数据、递归处理以及提取层级信息。作者通过示例展示了WITHRECURSIVE语句的应用及其在数仓中的结构表示。

mysql 8.0 递归处理 (sample database classicmodels _No.4)

准备工作,可以去下载 classicmodels 数据库资源如下

[ 点击:classicmodels]


(https://download.csdn.net/download/tomxjc/88685970)

前言

我们在做数据的时候 会碰到 部门表 ,员工表,这个一般是树型结构。我们先看下这个 全表的结构


一、查文档(recursion )

当然还是 看 mysql 文档了。


https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursion-limits

recursion 中文解释就是 递归或者循环

二、准备

select * FROM classicmodels.employees t
可以理解  report to 就是 父ID 


三、递归处理

WITH RECURSIVE

WITH RECURSIVE cte (officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo ,tree,n ) AS (
    SELECT officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo, cast(employeeNumber as char(100)) as 'tree'
    , 1 as 'n'
    FROM classicmodels.employees where employeeNumber='1002'
    UNION all
    SELECT t.officeCode,t.employeeNumber,t.firstname,t.lastName, t.jobTitle ,t.reportsTo,
  CONCAT(cn.tree , '->', t.employeeNumber) AS 'tree',n+1 as 'n'
    FROM classicmodels.employees t
    INNER JOIN cte cn ON t.reportsTo = cn.employeeNumber
)
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a 


这个说明下 tree 列就是加的一列

一般的 RECURSIVE 是和 with 一起使用的。下面就是结果

也可以 将 
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a 

替换成 
SELECT a.employeeNumber,b.City,b.country,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a left join classicmodels.offices b on a.officecode=b.officecode


四、提取

select tree,
if(n>=1, left(tree,4), null) as '1st',
if(n>=1 and length(tree)>4 ,  substring(tree,6,4), null) as '2st',
if(n>=1 and length(tree)>8 ,  substring(tree,11,4), null) as '3rd',
if(n>=1 and length(tree)>12 ,  substring(tree,16,4), null) as '4th'
from (

WITH RECURSIVE cte (officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo ,tree,n ) AS (
    SELECT officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo, cast(employeeNumber as char(100)) as 'tree'
    , 1 as 'n'
    FROM classicmodels.employees where employeeNumber='1002'
    UNION all
    SELECT t.officeCode,t.employeeNumber,t.firstname,t.lastName, t.jobTitle ,t.reportsTo,
  CONCAT(cn.tree , ',', t.employeeNumber) AS 'tree',n+1 as 'n'
    FROM classicmodels.employees t
    INNER JOIN cte cn ON t.reportsTo = cn.employeeNumber
)
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a) dd


截图结果就是 如下,这个基本就是数仓的结构了。

总结

以上就是一些分享,谢谢大家喜欢 ,后面还是 有其他关于classicmodels 例子 。



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
46 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
1月前
|
SQL 数据库
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
31 1
|
1月前
|
安全 关系型数据库 MySQL
mysql8.0 正值表达式Regular expressions (sample database classicmodels _No.5)
本文介绍了MySQL8.0中的正值表达式及其相关函数,通过实例展示了如何使用正则表达式进行字符串匹配,并提出了关于执行效率的问题。
51 1
|
1月前
|
SQL 关系型数据库 MySQL
介绍5款 世界范围内比较广的 5款 mysql Database Management Tool
介绍5款 世界范围内比较广的 5款 mysql Database Management Tool
51 0
|
1月前
|
SQL Oracle 关系型数据库
窗口函数(sample database classicmodels _No.8 )
本文介绍了SQL中的窗口函数,包括其概念、语法以及在实例中的应用。重点讲解了如何使用窗口函数进行聚合、排序和分析操作,特别提到了MySQL中常见的四个窗口函数:DENSE_RANK(),RANK(),ROW_NUMBER(),LAG()。
46 0
|
1月前
|
存储 Oracle 数据建模
大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)
大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)
37 0
|
1月前
|
存储 SQL NoSQL
大工程 从0到1 数据治理 数仓篇(sample database classicmodels _No.7)
大工程 从0到1 数据治理 数仓篇(sample database classicmodels _No.7)
40 0
|
6月前
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
91 2
|
6月前
|
Oracle 关系型数据库
19c 开启Oracle Database Vault
19c 开启Oracle Database Vault
162 1
|
6月前
|
SQL Oracle 关系型数据库
Connect to Autonomous Database Using Oracle Database Tools
Connect to Autonomous Database Using Oracle Database Tools
61 1