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| id | customer_id | product_id | name | department | amount | status | created_at | discount |
|---|---|---|---|---|---|---|---|---|
| 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 |
运行结果
| id | customer_id | product_id | name | department | amount | status | created_at | discount |
|---|---|---|---|---|---|---|---|---|
| 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 的作用范围有多大?
通常只在紧随其后的一条语句中有效。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。