在 SQL 中,WITH AS 语法通常用于创建 公用表表达式(CTE, Common Table Expression)。它可以让你的查询结构更清晰、更容易阅读,尤其适合处理复杂的多层嵌套查询。
WITH 临时表名 AS (
子查询语句
)
SELECT ... FROM 临时表名;说明:
WITH 后面定义一个或多个临时表(即 CTE)。AS 指定它的查询内容。假设我们有个表
-- 假设 sales 表结构:
CREATE TABLE sales (salesperson_id INT, sales_amount DECIMAL);WITH sales_summary AS (
SELECT
salesperson_id,
SUM(sales_amount) AS total_sales
FROM sales
GROUP BY salesperson_id
)
SELECT salesperson_id, total_sales
FROM sales_summary
WHERE total_sales > 100000;解释: 先在 WITH 中统计每个销售员的业绩,然后在主查询里筛选出业绩超过 10万 的销售员。
你可以同时定义多个临时表。
WITH
sales_summary AS (
SELECT salesperson_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY salesperson_id
),
top_sales AS (
SELECT salesperson_id, total_sales
FROM sales_summary
WHERE total_sales > 100000
)
SELECT *
FROM top_sales;递归 CTE 用于层级结构查询(比如组织架构、目录树等)。
sql
WITH RECURSIVE subordinates AS (
SELECT employee_id, manager_id, employee_name
FROM employees
WHERE manager_id IS NULL -- 找出顶层经理
UNION ALL
SELECT e.employee_id, e.manager_id, e.employee_name
FROM employees e
INNER JOIN subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinates;解释: 这个递归查询会顺着经理层级一直往下找所有下属。
注意 RECURSIVE 它是数据库的关键词,用于指定 CTE 的类型(递归型)。
项目 | 作用 |
|---|---|
WITH ... AS (...) | 定义临时的结果集 |
可定义多个临时表 | 用逗号分隔多个 CTE |
可递归 | 用 WITH RECURSIVE 实现层级查询 |
优点 | 代码更清晰、易维护、可代替多层嵌套子查询 |
特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com 第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤ 免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。