MySQL:CTE 通用表达式

简介: CTE(通用表表达式)为处理复杂查询提供了强大的工具。通过普通CTE,可以简化查询逻辑,提高可读性;通过递归CTE,可以优雅地处理层级结构数据。掌握CTE的使用,对于提升SQL查询能力和优化数据库操作有着重要意义。希望本文能帮助你更好地理解和使用MySQL中的CTE,提高工作效率和代码质量。

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_name
    WHERE 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, salary
    FROM employees
    WHERE 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_name
    WHERE condition
    UNION ALL
    -- 递归成员
    SELECT column1, column2, ...
    FROM cte_name
    JOIN 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_id
    FROM employees
    WHERE emp_name = 'Alice'
    UNION ALL
    -- 递归成员:Alice的下属及其下属
    SELECT e.emp_id, e.emp_name, e.manager_id
    FROM employees e
    JOIN 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          |
+--------+----------+------------+
​

三、CTE的优势

  1. 简洁性:CTE可以将复杂查询分解为多个易于理解的部分,提高代码的可读性。
  2. 复用性:定义一次CTE,可以在后续查询中多次引用,避免重复代码。
  3. 递归查询:递归CTE提供了一种优雅的方式来处理层级结构的数据。

四、思维导图

CTE 通用表达式
│
├── 普通CTE
│   ├── 语法
│   └── 示例
│       └── 查询部门ID为1的员工信息
│
├── 递归CTE
│   ├── 语法
│   └── 示例
│       └── 查询员工Alice的所有下属
│
└── 优势
    ├── 简洁性
    ├── 复用性
    └── 递归查询
​

五、总结

CTE(通用表表达式)为处理复杂查询提供了强大的工具。通过普通CTE,可以简化查询逻辑,提高可读性;通过递归CTE,可以优雅地处理层级结构数据。掌握CTE的使用,对于提升SQL查询能力和优化数据库操作有着重要意义。希望本文能帮助你更好地理解和使用MySQL中的CTE,提高工作效率和代码质量。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
MySQL8.0新特性之公用表表达式学习
公用表表达式(或通用表表达式)简称为CTE(Common Table Expressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询。所以,可以考虑代替子查询。
376 0
|
8月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
221 15
|
安全 关系型数据库 MySQL
mysql8.0 正值表达式Regular expressions (sample database classicmodels _No.5)
本文介绍了MySQL8.0中的正值表达式及其相关函数,通过实例展示了如何使用正则表达式进行字符串匹配,并提出了关于执行效率的问题。
330 1
|
关系型数据库 MySQL
mysql 使用CTE写法
mysql 使用CTE写法
|
SQL 数据采集 关系型数据库
在 MySQL 中使用 CTE
【8月更文挑战第11天】
1342 0
在 MySQL 中使用 CTE
第18章_MySQL8新特性之CTE(公用表表达式)
第18章_MySQL8新特性之CTE(公用表表达式)
230 0
|
关系型数据库 MySQL
MySQL的where表达式操作
MySQL的where表达式是用来过滤数据的,可以用来限制查询的结果集。以下是一些常见的where表达式操作:
293 0
|
关系型数据库 MySQL
MySQL的where表达式中的各种运算符的用法和细节
MySQL的where表达式中的各种运算符的用法和细节
188 0
|
关系型数据库 MySQL
MySQL的where表达式中的各种运算符的用法和细节
MySQL的where表达式中的各种运算符的用法和细节
227 0
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
165 3

推荐镜像

更多