当前位置: 首页 > news >正文

MySQL:CTE 通用表达式

在MySQL中,CTE(Common Table Expressions,通用表表达式)是一种简洁而强大的语法,用于构建临时的结果集,通常用于简化复杂查询。CTE通过关键字 WITH引入,定义一个可以在后续查询中引用的临时结果集。CTE有两种类型:普通CTE和递归CTE。

一、普通CTE

普通CTE用于定义一个非递归的临时结果集,通常用于提高查询的可读性和维护性。

1. 语法

普通CTE的基本语法如下:

WITH cte_name (column1, column2, ...)
AS
(SELECT column1, column2, ...FROM table_nameWHERE condition
)
SELECT *
FROM cte_name;
​
2. 示例

假设我们有一个名为 employees的表,结构如下:

CREATE TABLE employees (emp_id INT,emp_name VARCHAR(100),dept_id INT,salary DECIMAL(10, 2)
);INSERT INTO employees (emp_id, emp_name, dept_id, salary) VALUES
(1, 'Alice', 1, 5000.00),
(2, 'Bob', 2, 6000.00),
(3, 'Charlie', 1, 5500.00),
(4, 'David', 3, 7000.00),
(5, 'Eve', 2, 6500.00);
​

我们希望查询部门ID为1的所有员工信息,可以使用普通CTE:

WITH dept1_employees AS (SELECT emp_id, emp_name, salaryFROM employeesWHERE dept_id = 1
)
SELECT *
FROM dept1_employees;
​

该查询结果为:

+--------+----------+--------+
| emp_id | emp_name | salary |
+--------+----------+--------+
| 1      | Alice    | 5000.00|
| 3      | Charlie  | 5500.00|
+--------+----------+--------+
​
二、递归CTE

递归CTE用于解决具有层级关系的数据查询问题,如组织结构、类别层级等。递归CTE由两个部分组成:锚定成员(非递归部分)和递归成员。

1. 语法

递归CTE的基本语法如下:

WITH RECURSIVE cte_name (column1, column2, ...)
AS
(-- 锚定成员SELECT column1, column2, ...FROM table_nameWHERE conditionUNION ALL-- 递归成员SELECT column1, column2, ...FROM cte_nameJOIN table_name ON condition
)
SELECT *
FROM cte_name;
​
2. 示例

假设我们有一个名为 employees的表,包含员工及其经理的信息:

CREATE TABLE employees (emp_id INT,emp_name VARCHAR(100),manager_id INT
);INSERT INTO employees (emp_id, emp_name, manager_id) VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Charlie', 2),
(4, 'David', 1),
(5, 'Eve', 3);
​

我们希望查询员工Alice的所有直接和间接下属,可以使用递归CTE:

WITH RECURSIVE subordinates AS (-- 锚定成员:Alice本身SELECT emp_id, emp_name, manager_idFROM employeesWHERE emp_name = 'Alice'UNION ALL-- 递归成员:Alice的下属及其下属SELECT e.emp_id, e.emp_name, e.manager_idFROM employees eJOIN subordinates s ON e.manager_id = s.emp_id
)
SELECT *
FROM subordinates;
​

该查询结果为:

+--------+----------+------------+
| emp_id | emp_name | manager_id |
+--------+----------+------------+
| 1      | Alice    | NULL       |
| 2      | Bob      | 1          |
| 3      | Charlie  | 2          |
| 4      | David    | 1          |
| 5      | Eve      | 3          |
+--------+----------+------------+
http://www.xdnf.cn/news/932131.html

相关文章:

  • 在React 中安装和配置 shadcn/ui
  • 我用Cursor写了一个视频转文字工具,已开源,欢迎体验
  • leetcode 10. 正则表达式匹配
  • 对比传统引擎,Unity3D 在生产配套中的独特优势
  • 【MySQL系列】MySQL 执行 SQL 文件
  • Java后端检查空条件查询
  • 快排图解及JS模板代码
  • 循环变量捕获问题​​
  • redis--黑马点评--分布式锁实现详解
  • 【C/C++】EBO空基类优化介绍
  • C++----剖析list
  • 言和语的洞见,即:融智学解决方案
  • SEO新手优化步骤拆解
  • 人脸识别技术应用备案办理指南
  • 可可·香奈儿 活出自己
  • 【Elasticsearch】映射:null_value 详解
  • 代码规范和架构【立芯理论一】(2025.06.08)
  • 分形几何在医学可视化中的应用:从理论到Python实战
  • 元素水平垂直居中的方法
  • Jinja2深度解析与应用指南
  • 高等数学》(同济大学·第7版)第三章第四节“函数的单调性与曲线的凹凸性“
  • 开源大模型网关:One API实现主流AI模型API的统一管理与分发
  • 【C++系列】智能指针自定义析构
  • 如何将淘宝店铺商品搬到抖店去?利用 API 实现淘宝店铺商品到抖店的高效迁移
  • 5-C#的DateTime使用
  • Web后端基础(基础知识)
  • 基于PTN传输承载的4G网络-故障未连接...(我不理解哪错了排查了几遍没发现哪错啊啊啊啊)
  • AI架构师如何创建自己的知识库
  • JS手写代码篇---手写ajax
  • 计组_导学