当前位置: 代码网 > it编程>数据库>Mysql > MySQL CTE 通用表达式详解

MySQL CTE 通用表达式详解

2025年06月10日 Mysql 我要评论
在mysql中,cte(common table expressions,通用表表达式)是一种简洁而强大的语法,用于构建临时的结果集,通常用于简化复杂查询。cte通过关键字 with引入,定义一个可以

在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          |
+--------+----------+------------+

到此这篇关于mysql cte 通用表达式的文章就介绍到这了,更多相关mysql cte 通用表达式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com