2026/5/20 17:01:13
网站建设
项目流程
阿里网 网站备案流程,dnf游戏币交易网站建设,app开发公司哪个好,沈阳网站建设索王道下拉SQL 中的 WITH ... AS ... 是一种非常强大且常用的语法结构#xff0c;用于定义公用表表达式#xff08;Common Table Expression#xff0c;简称 CTE#xff09;。它可以帮助你将复杂的查询拆解为更清晰、可读性更强的逻辑块。 一、基本语法
WITH cte_name AS (-- 子查询…SQL 中的WITH ... AS ...是一种非常强大且常用的语法结构用于定义公用表表达式Common Table Expression简称CTE。它可以帮助你将复杂的查询拆解为更清晰、可读性更强的逻辑块。一、基本语法WITH cte_name AS ( -- 子查询SELECT 语句 SELECT ... ) SELECT * FROM cte_name;cte_name你给这个临时结果集起的名字类似一个临时视图。AS (...)括号内是一个标准的SELECT查询不能包含INSERT、UPDATE、DELETE等 DML 语句。CTE 只在当前语句中有效执行完就释放不会持久化。二、为什么用 CTE提高可读性把复杂逻辑分解成多个步骤。避免重复子查询如果同一个子查询要用多次用 CTE 定义一次即可。支持递归查询这是 CTE 最强大的特性之一如查询组织架构、树形结构等。三、简单示例假设有一张员工表employees(id, name, manager_id, salary)示例 1非递归 CTE找出工资高于平均工资的员工WITH avg_salary AS ( SELECT AVG(salary) AS avg_sal FROM employees ) SELECT e.name, e.salary FROM employees e JOIN avg_salary a ON e.salary a.avg_sal;这里avg_salary是一个只含一行一列的临时表供主查询使用。示例 2多个 CTE用逗号分隔WITH high_earners AS ( SELECT id, name, salary FROM employees WHERE salary 100000 ), dept_counts AS ( SELECT department_id, COUNT(*) AS emp_count FROM employees GROUP BY department_id ) SELECT h.name, h.salary, d.emp_count FROM high_earners h JOIN employees e ON h.id e.id JOIN dept_counts d ON e.department_id d.department_id;多个 CTE 之间用逗号分隔最后一个 CTE 后直接跟主查询。四、递归 CTERecursive CTE用于处理层级结构或树形数据比如公司组织架构、评论的父子关系、物料清单等。递归 CTE 语法WITH RECURSIVE cte_name AS ( -- 初始查询锚点成员 SELECT ... UNION ALL -- 递归查询引用自身 SELECT ... FROM cte_name JOIN ... ) SELECT * FROM cte_name;注意有些数据库如 PostgreSQL、MySQL 8.0、SQL Server需要写WITH RECURSIVE而有些如 SQL Server只需WITH即可自动识别递归。示例查询某员工的所有下属多级WITH RECURSIVE subordinates AS ( -- 锚点从某个经理开始比如 id 1 SELECT id, name, manager_id, 0 AS level FROM employees WHERE id 1 UNION ALL -- 递归找下一级员工 SELECT e.id, e.name, e.manager_id, s.level 1 FROM employees e INNER JOIN subordinates s ON e.manager_id s.id ) SELECT * FROM subordinates;这会返回 ID 为 1 的员工及其所有直接/间接下属并标注层级深度。五、注意事项数据库是否支持 CTE是否需要RECURSIVE关键字PostgreSQL✅需要递归时MySQL 8.0✅需要递归时SQL Server✅不需要自动识别Oracle✅不需要但可用SQLite 3.8.3✅需要递归时旧版 MySQL8.0❌不支持六、CTE vs 子查询 vs 临时表特性CTE子查询临时表可读性⭐⭐⭐⭐⭐⭐⭐⭐⭐性能通常与子查询相当优化器会重写同左可能更快可加索引作用域仅当前语句仅当前查询块当前会话支持递归✅❌❌除非手动循环可重复引用✅多次❌需复制✅七、总结WITH ... AS ...定义的是临时命名结果集CTE。适用于简化复杂查询、提升可读性、实现递归逻辑。在现代 SQL 开发中几乎是必备技能。