【学习记录】【SQL】with子句

with子句在SQL中用于创建临时结果集,类似于临时表,可以被后续的查询操作引用。它允许将复杂的查询分解为多个子查询,如subtable1,subtable2,subtable3,然后通过JOIN操作结合这些子查询来获取最终结果。
SQL 中的 WITH 子句(也称为公共表表达式,Common Table Expressions, CTEs)允许在查询中定义临时命名的结果集,这些结果集可以在后续查询中被引用。使用 WITH 子句可以提高查询的可读性和可维护性,尤其适用于复杂查询。 ### 使用方法 基本语法如下: ```sql WITH cte_name1 AS (SELECT ...), cte_name2 AS (SELECT ...) SELECT ... FROM cte_name1 JOIN cte_name2 ON ...; ``` 可以定义一个或多个 CTE,每个 CTE 都有一个名称(如 `cte_name1`、`cte_name2`),后面跟着 `AS` 和一个括号内的 `SELECT` 语句,用于生成该 CTE 的结果集。在主查询中,可以像使用普通表一样引用这些 CTE。 ### 示例 #### 示例 1:简单的 CTE 使用 ```sql WITH cte AS ( SELECT user_id, SUM(amount) AS total FROM transactions GROUP BY user_id ) SELECT * FROM cte WHERE total > 1000; ``` 在这个示例中,定义了一个名为 `cte` 的 CTE,它从 `transactions` 表中按 `user_id` 分组,并计算每个用户的总金额。主查询从 `cte` 中选择总金额大于 1000 的记录 [^2]。 #### 示例 2:多个 CTE 的使用 ```sql WITH cte1 AS ( SELECT column1, column2 FROM some_table WHERE some_condition ), cte2 AS ( SELECT column3, column4 FROM another_table WHERE another_condition ) SELECT * FROM cte1 JOIN cte2 ON cte1.common_column = cte2.common_column; ``` 这里定义了两个 CTE:`cte1` 和 `cte2`。主查询将这两个 CTE 进行连接,基于它们共有的列 `common_column` [^3]。 #### 示例 3:结合 ROW_NUMBER() 和 TOP 子句 ```sql WITH RankedProducts AS ( SELECT product_name, sales_quantity, ROW_NUMBER() OVER (PARTITION BY supplier_id ORDER BY sales_quantity DESC) AS rn FROM products ) SELECT TOP 10 product_name, sales_quantity FROM RankedProducts WHERE rn <= 3 ORDER BY sales_quantity DESC; ``` 这个示例中,`RankedProducts` CTE 为每个供应商的产品按销售数量降序排名。主查询从排名前 3 的产品中选择前 10 个产品 [^4]。 #### 示例 4:CTE 与表连接 ```sql WITH TEMP_A AS ( SELECT column1, column2 FROM some_table WHERE some_condition ) SELECT * FROM TEMP_A a JOIN another_table b ON a.common_column = b.common_column WHERE a.some_other_condition; ``` 定义了一个名为 `TEMP_A` 的 CTE,主查询将 `TEMP_A` 与 `another_table` 进行连接,并添加了额外的过滤条件 [^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值