MySQL CTE 通用表达式详解

 更新时间:2025年06月10日 09:55:05   作者:yt94832  
在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          |
+--------+----------+------------+

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

相关文章

  • mysql 从 frm 文件恢复 table 表结构的3种方法【推荐】

    mysql 从 frm 文件恢复 table 表结构的3种方法【推荐】

    这篇文章主要介绍了mysql 从 frm 文件恢复 table 表结构的3种方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • MySQL8.0无法远程连接访问的解决方法

    MySQL8.0无法远程连接访问的解决方法

    本文主要介绍了MySQL8.0无法远程连接访问的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Mysql百万级分页优化技巧

    Mysql百万级分页优化技巧

    这篇文章主要介绍了Mysql百万级分页优化技巧,包括普通分页和优化分页两种,在数据量比较大的时候,我们尽量去利用索引来优化语句。下面通过本文给大家详细讲解,一起看看吧
    2016-12-12
  • mysql server is running with the --skip-grant-tables option

    mysql server is running with the --skip-grant-tables option

    今天在mysql中新建数据库提示The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement,原来是数据中配置的--skip-grant-tables,这样安全就降低了,这个一般当忘记root密码的时候需要这样操作
    2017-07-07
  • MySQL数据库中把int转化varchar引发的慢查询

    MySQL数据库中把int转化varchar引发的慢查询

    这篇文章主要介绍了MySQL数据库中把int转化varchar引发的慢查询 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • MySQL抛出Incorrect string value异常分析

    MySQL抛出Incorrect string value异常分析

    从上至下统一用上UTF-8就高枕无忧,今天还是遇到字符的异常,本文将介绍解决方法
    2012-11-11
  • MySQL中count(*)、count(1)和count(col)的区别汇总

    MySQL中count(*)、count(1)和count(col)的区别汇总

    count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,下面这篇文章主要给大家总结介绍了关于MySQL中count(*)、count(1)和count(col)的区别,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-03-03
  • MariaDB(Mysql分支)my.cnf配置文件中文注释版

    MariaDB(Mysql分支)my.cnf配置文件中文注释版

    这篇文章主要介绍了MariaDB my.cnf配置文件中文注释版,MariaDB是Mysql的一个分支,完全兼容Mysql,需要的朋友可以参考下
    2014-06-06
  • Windows下MySql错误代码1045的解决方法

    Windows下MySql错误代码1045的解决方法

    这篇文章主要介绍了Windows下MySql错误代码1045的解决方法,文中还包含了2个Linux下的解决方法,需要的朋友可以参考下
    2014-06-06
  • IDEA找不到Database的完美解决方法

    IDEA找不到Database的完美解决方法

    IntelliJ IDEA中可以用database来连接数据库,但也会经常遇到问题,下面这篇文章主要给大家介绍了关于IDEA找不到Database的完美解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论