SQLPathLab
CTE 与递归 · 高级

WITH

用 CTE 拆分复杂查询。

本页使用窗口函数或 CTE;MySQL 需要 8.0 及以上版本。

简介

WITH 定义只在当前语句中可见的公共表表达式(CTE),可以把复杂查询拆成带名称的步骤。CTE 有助于阅读、复用中间结果和逐段调试,但并不自动保证性能更好;MySQL 8.0 的优化方式还取决于查询结构和版本。多个 CTE 用逗号分隔,后面的定义可以引用前面的定义。

基础语法

WITH high_orders AS (SELECT * FROM orders WHERE amount > 1000) SELECT * FROM high_orders;

示例

WITH 示例

先定义 high_orders 筛选金额大于 1000 的订单,再从这个具名结果集中读取全部记录。

示例数据表

表名:orders
orders
idcustomer_idproduct_idnamedepartmentamountstatuscreated_atdiscount
1 101 201 Alice Sales 1200 paid 2026-01-03 0
2 102 202 Bob IT 900 pending 2026-01-08 50
3 101 201 Cindy Sales 1500 paid 2026-02-02 100
4 104 203 David HR 700 cancelled 2026-02-15 0

运行结果

result
idcustomer_idproduct_idnamedepartmentamountstatuscreated_atdiscount
1 101 201 Alice Sales 1200 paid 2026-01-03 0
3 101 201 Cindy Sales 1500 paid 2026-02-02 100

常见问题

CTE 会自动提升性能吗?

不会。它主要改善结构和可读性,是否物化及性能表现取决于数据库版本和优化器。

一个 WITH 可以定义多个 CTE 吗?

可以,多个定义用逗号分隔,后面的 CTE 还能引用前面已经定义的 CTE。

CTE 的作用范围有多大?

通常只在紧随其后的一条语句中有效。

标签

常用过滤数据

这篇内容是否清楚?