1. WITH AS语法概述
WITH AS语法(又称公用表表达式CTE)是MySQL 8.0引入的重要特性,它允许我们在一个查询中定义临时命名结果集,这个结果集仅在该查询执行期间存在。作为一名长期使用MySQL的开发者,我发现这个特性特别适合处理需要多次引用相同子查询的复杂场景。
注意:WITH AS语法需要MySQL 8.0及以上版本支持,如果你还在使用5.7或更早版本,需要考虑升级或使用临时表替代方案。
基本语法结构如下:
sql复制WITH cte_name (column_list) AS (
subquery
)
SELECT * FROM cte_name;
这种语法结构看似简单,但在实际应用中却能大幅提升复杂查询的可读性和维护性。我经常在以下场景使用它:
- 需要多次引用同一个子查询时
- 需要递归查询层级数据时
- 需要分步骤构建复杂查询逻辑时
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础用法详解
2.1 单次CTE使用
最简单的CTE应用就是将一个子查询结果定义为临时表,然后在主查询中引用:
sql复制WITH department_stats AS (
SELECT
department_id,
COUNT(*) as employee_count,
AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
)
SELECT
d.department_name,
ds.employee_count,
ds.avg_salary
FROM departments d
JOIN department_stats ds ON d.department_id = ds.department_id;
这种用法相比直接写子查询有几个优势:
- 查询逻辑更清晰,可读性更好
- 避免重复编写相同子查询
- 便于后续维护和修改
2.2 多次引用同一CTE
CTE真正的威力在于可以多次引用同一个临时结果集:
sql复制WITH high_value_customers AS (
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 10000
)
SELECT
c.customer_name,
COUNT(o.order_id) as order_count,
SUM(o.amount) as total_spent
FROM customers c
JOIN orders o
