mysql 使用CTE写法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql 使用CTE写法

在MySQL中,公共表表达式(Common Table Expressions,简称CTE)是一种临时的结果集,可以在单个查询中被引用多次。CTE通常用于递归查询和复杂的数据操作。MySQL 8.0及以上版本支持CTE。

以下是使用CTE的基本语法:

基本CTE写法

WITH cte_name (column1, column2, ...)
AS
(
    -- CTE的定义部分,可以是任意的SELECT语句
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition
)
SELECT *
FROM cte_name
WHERE another_condition;

递归CTE写法

递归CTE是CTE的一种特殊形式,它允许查询自身引用。这在处理层次或递归数据结构时非常有用。

WITH RECURSIVE cte_name (column1, column2, ...)
AS
(
    -- 递归的初始部分,定义了递归的起点
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition

    UNION ALL

    -- 递归部分,递归地引用CTE本身
    SELECT column1, column2, ...
    FROM cte_name
    JOIN table_name ON join_condition
    WHERE another_condition
)
SELECT *
FROM cte_name
WHERE yet_another_condition;

示例

假设我们有一个员工表employees,包含员工ID、员工名字和经理ID,我们想要查询所有员工及其下属的名单。

WITH RECURSIVE employee_cte (employee_id, employee_name, manager_id, level) AS
(
    -- 基础查询,选择所有员工作为起点
    SELECT employee_id, employee_name, manager_id, 1 AS level
    FROM employees
    WHERE manager_id IS NULL -- 假设NULL表示顶级经理

    UNION ALL

    -- 递归查询,连接员工表和CTE
    SELECT e.employee_id, e.employee_name, e.manager_id, ec.level + 1
    FROM employees e
    INNER JOIN employee_cte ec ON ec.employee_id = e.manager_id
)
SELECT *
FROM employee_cte;

在这个例子中,我们首先选择了所有没有经理的员工(即顶级经理),然后递归地选择了所有下属员工。

注意事项

  • CTE必须在查询的最上方定义。
  • CTE可以在SELECT、INSERT、UPDATE或DELETE语句中使用。
  • 递归CTE使用WITH RECURSIVE关键字,并且必须包含初始查询(称为锚点)和递归查询。
  • 在递归CTE中,UNION ALL是必须的,它将基础查询和递归查询的结果合并起来。
  • 递归查询可能会无限递归,因此通常需要一个WHERE子句来限制递归的深度。

CTE提供了一种强大的方式来编写更清晰、更易于理解的复杂查询。在MySQL 8.0及以上版本中,CTE是处理层次数据和递归查询的推荐方法。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 数据采集 关系型数据库
在 MySQL 中使用 CTE
【8月更文挑战第11天】
172 0
在 MySQL 中使用 CTE
第18章_MySQL8新特性之CTE(公用表表达式)
第18章_MySQL8新特性之CTE(公用表表达式)
105 0
|
SQL 存储 关系型数据库
Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)
# 1.窗口函数 MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。
Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)
|
SQL 弹性计算 关系型数据库
PostgreSQL 12 preview - CTE 增强,支持用户语法层控制 materialized 优化
标签 PostgreSQL , CTE , materialized , not materialized , push down 背景 PostgreSQL with 语法,能跑非常复杂的SQL逻辑,包括递归,多语句物化计算等。 在12以前的版本中,WITH中的每一个CTE(common table express),都是直接进行物化的,也就是说外层的条件不会推到CTE(物化节点)里
998 0
|
MySQL 关系型数据库 内存技术
MySQL · 新特性分析 · CTE执行过程与实现原理
众所周知,Common table expression(CTE)是在大多数的关系型数据库里都存在的特性,包括ORACLE, SQLSERVER,POSTGRESQL等,唯独开源数据库老大MySQL缺失。CTE作为一个方便用户使用的功能,原本是可以利用普通的SQL语句替代的,但是对于复杂的CTE来说,要模拟出CTE的效果还是需要很大的功夫。如果考虑性能那就更是难上加难了。2013年Guilhem
4211 1
|
传感器 SQL 并行计算
【重新发现PostgreSQL之美】 - 6 index链表跳跳糖 (CTE recursive 递归的详细用例)
大家好,这里是重新发现PostgreSQL之美 - 6 index链表跳跳糖 (CTE recursive 递归的详细用例)
|
SQL 分布式计算 并行计算
PostgreSQL 并行计算解说 之29 - parallel 递归查询, 树状查询, 异构查询, CTE, recursive CTE, connect by
标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan parallel index scan
256 0
|
SQL 关系型数据库 MySQL
MySQL8.0之CTE(公用表表达式)
MySQL8.0 CTE 通用表达式
3411 1
|
关系型数据库 MySQL
干货 | 解读MySQL 8.0新特性:CTE
CTE也就是common table expressions,是SQL标准里的语法,很多数据库都能够支持,MySQL也在8.0版本里加入了CTE功能。本文主要简单的介绍下该语法的用法,由于笔者对server层了解不深,本文不探讨代码层。
1819 0