【with as】

短语,也叫做子查询部分
定义一个SQL片断,加个别名,该片断可以被整个SQL语句直接调用。
有的时候,with as是为了提高SQL语句的可读性,减少嵌套冗余,优化执行效率。
例(如图):
先执行select di.name from apm.ms_dict_item di 把结果放到一个临时表A中,作为全局使用。
在这里插入图片描述

06-25
### `WITH AS` 语法在 SQL 中的作用与使用方式 `WITH AS` 是 SQL 中用于定义 **CTE(Common Table Expression,公共表表达式)** 的关键字。CTE 提供了一种将复杂查询拆分为多个逻辑部分的方法,从而提高代码的可读性和可维护性。它类似于临时表,但其生命周期仅限于当前查询。 #### 基本结构 ```sql WITH cte_name AS ( -- 查询语句 SELECT ... FROM ... ) -- 使用 CTE 的主查询 SELECT * FROM cte_name; ``` 例如: ```sql WITH sales_summary AS ( SELECT region, SUM(sales) AS total_sales FROM sales_data GROUP BY region ) SELECT * FROM sales_summary WHERE total_sales > 10000; ``` 此示例中,`sales_summary` 是一个 CTE,用于计算每个区域的总销售额,并在后续查询中被引用[^1]。 #### 多个 CTE 的嵌套与复用 可以在同一个 `WITH` 子句中定义多个 CTE,并且后面的 CTE 可以引用前面定义的 CTE。例如: ```sql WITH cte1 AS ( SELECT 1 AS val FROM dual ), cte2 AS ( SELECT val + 1 AS new_val FROM cte1 ) SELECT * FROM cte2; ``` 在这个例子中,`cte2` 使用了 `cte1` 的结果进行进一步计算[^1]。 #### 递归 CTE SQL 还支持递归形式的 CTE,通常用于处理层次结构数据(如树形结构或图)。基本结构如下: ```sql WITH RECURSIVE cte_name AS ( -- 初始查询 SELECT ... UNION ALL -- 递归查询 SELECT ... FROM cte_name WHERE ... ) SELECT * FROM cte_name; ``` 例如,查询一个员工层级结构: ```sql WITH RECURSIVE employee_hierarchy AS ( SELECT employee_id, manager_id, name FROM employees WHERE manager_id IS NULL -- 根节点 UNION ALL SELECT e.employee_id, e.manager_id, e.name FROM employees e INNER JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM employee_hierarchy; ``` 该查询从最高管理者开始,逐层查找下属员工,构建完整的组织结构[^1]。 #### 优点 - **可读性增强**:将复杂查询分解为多个逻辑块。 - **代码复用**:多个部分可以引用同一个 CTE。 - **递归能力**:支持对层次结构数据的遍历和操作。 - **性能优化**:某些数据库系统会对 CTE 进行优化,提升执行效率。 #### 注意事项 - CTE 的作用域仅限于紧随其后的单条 `SELECT`, `INSERT`, `UPDATE`, 或 `DELETE` 语句。 - 不同数据库系统(如 PostgreSQL、MySQL、SQL Server)对 CTE 的支持略有差异,需注意兼容性问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值