目录
- 一、内联视图的特点
- 二、内联视图的用途
- 三、内联视图的示例
-
- 示例1:简单内联视图
- 示例2:嵌套内联视图与视图合并
- 示例3:分页查询
- 四、注意事项
- 五、内联视图等价改写优化方法
-
- 1.内联视图等价改写的目的
- 2.内联视图等价改写的方法
-
- 方法一:将内联视图替换为临时表或物化视图
- 方法二:将内联视图展开到主查询中
- 方法三:使用CTE(Common Table Expression,公用表表达式)
- 方法四:将内联视图中的多层嵌套拆分为多个查询
Oracle内联视图(Inline View)是一种在SQL查询中直接嵌入子查询的构造,它允许您在FROM子句中定义一个临时的、只在当前查询上下文中存在的逻辑视图。这个“视图”实际上是子查询的结果集,它在查询执行期间被计算,但不会存储为持久的数据库对象。内联视图有助于简化复杂查询、抽象数据处理逻辑以及实现查询优化。
一、内联视图的特点
-
临时性:内联视图仅在使用它的查询执行时存在,不会保存到数据字典中作为独立的对象,不像常规视图那样需要预先创建并命名。
-
可嵌套:内联视图可以嵌套在其他内联视图内部,形成多层次的查询结构,以适应复杂的分析需求。
-
绑定变量:在内联视图中可以使用绑定变量,允许动态传递参数,增强查询的灵活性和重用性。
-
查询优化:Oracle的Cost-Based Optimizer (CBO)会对内联视图进行分析,可能对其进行视图合并(View Merge)、谓词推断(Predicate Pushdown)等优化操作,以生成高效的执行计划。
二、内联视图的用途
-
简化复杂查询:通过将复杂的子查询封装成内联视图,可以将查询逻辑分解为易于理解和管理的部分。
-
数据聚合:用于计算聚合值(如SUM、AVG、COUNT等)或分组统计,特别是在JOIN操作中提供中间结果。
-
筛选和过滤:用于应用特定条件筛选数据,尤其是在涉及多表连接时,通过内联视图提前过滤掉不必要的行,减轻后续处理负担。
-
分页查询:结合ROWNUM或RANK函数,实现分页结果的获取,特别是在不支持窗口函数的旧版Oracle中。
-
模拟多表JOIN:当实际不存在物理关联时,可以通过内联视图模拟多表JOIN的效果,如实现自连接或交叉表查询。
三、内联视图的示例
示例1:简单内联视图
SELECT customer_name, total_sales
FROM (
SELECT customer_id, SUM(sales_amount) AS total_sales
FROM sales_table
GROUP BY customer_id
) AS sales_summary
JOIN customers_table
ON sales_summary.customer_id = customers_table.customer_id;
在这个示例中,内联视图sales_summary
计算每个客户的总销售额,然后与customers_table
联接,以显示客户名称及其对应的总销售额。
示例2:嵌套内联视图与视图合并
SELECT product_name, AVG(quantity_sold)
FROM (
SELECT p.product_name, s