热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle数据库内嵌视图

关系视图是数据库对象,创建关系视图实际是对查询定义可重用的需求。但有时,查询定义并不会被重用。此时,创建关系视图便不再适宜------过多

关系视图是数据库对象,创建关系视图实际是对查询定义可重用的需求。但有时,查询定义并不会被重用。此时,创建关系视图便不再适宜------过多的关系视图势必增加数据库的维护成本。oracle提供了内嵌视图来解决这一问题。

1、内嵌视图简介

如同关系视图,内嵌视图也是查询定义。内嵌的意义在于,视图定义嵌入在复杂查询语句中,其角色与普通数据表或关系视图相同。内嵌视图不必使用create view 命令进行创建,因此,在数据字典中也无法获得相应信息。内嵌视图是子查询的一种,可以与数据表、视图一样作为查询语句的数据源存在,但在形式上有较大的区别。


数据表和关系视图作为数据源,只需要出现对象名称即可,而内嵌视图则是以SQL查询语句的形式存在。


2、使用内嵌视图

内嵌视图可以应用于查询语句、更新语句及插入语句中。其中,最常用的场景为复杂查询中的子查询或作为中间结果集


例子:在表employees中存储了员工的信息,现需获取年龄最小的两名员工的信息,为了保证最终结果的正确性,首先进行人工分析。

SQL>select * from employees;

分析所有员工情况可知,employee_id为4和5的员工为我们的搜寻目标。

按照习惯思维&#xff0c;首先应当将所有记录按照employee_age进行升序排列&#xff0c;然后获取前两位员工的信息。oracle数据表的伪劣rownum可以返回每行记录所对应的行号&#xff0c;利用rownum<3的条件可以返回前两行记录。尝试使用如下SQL语句进行搜寻。

SQL>select * from employees where rownum<3 order by employee_age;

其中&#xff0c;order by employee_age用于对表employees中的记录按照employee_age值由小到大进行排序&#xff1b;where rownum<3则是搜索条件-----搜寻到的结果集的行号小于3.

但是&#xff0c;分析查询结果可知&#xff0c;该搜寻结果与预期结果并不符合&#xff0c;这是因为&#xff0c;rownum对结果集中的各记录赋以行号的时候&#xff0c;并未进行排序。也就是说&#xff0c;rownum的赋值操作处于order by employee_age操作之后&#xff0c;因此&#xff0c;利用此语句并不能获得预期的效果。

内嵌式图正式解决这个问题的最佳策略。利用内嵌视图&#xff0c;可以首先获得排序之后的结果集&#xff0c;然后将该结果集作为数据源进行查询时&#xff0c;rownum自然按照此时的顺序赋值。这样就可以在排序之后进行rownum的赋值动作。相应的SQL语句如下所示&#xff1a;

SQL>select * from ( select * from employees order by employee_age ) where rownum <3 &#xff1b;

其中&#xff0c;( select * from employees order by employee_age )即为内嵌视图&#xff0c;该内嵌视图实际提供了一个数据源。该数据源时将表employees中的记录按employee_age列进行升序排列之后得到的。where rownum <3 则是自封装之后的数据源&#xff0c;获取前两行数据&#xff0c;从而得到年龄最小的两位员工。

例子&#xff1a;内嵌视图往往与其他数据源&#xff08;数据表、关系视图等&#xff09;一起使用。此时便需要内嵌视图指定别名&#xff0c;以便引用&#xff0c;并与其他数据源中的列进行区分。

上面的列子中&#xff0c;使用了内嵌视图获得了年龄最小的两位员工的记录。同时&#xff0c;还想获得两位员工的工资情况&#xff0c;那么可以使用内嵌视图与表salary进行连接。此时&#xff0c;在内嵌式图与表salary中会存在重复列&#xff0c;因此&#xff0c;需要为内嵌视图指定别名。

SQL> select * t.employee_id, t.employee_name, t.employee_age, s.salary from 

( select * from (  select * from employees order by employee_age) where rownum <3 ) t, salary s 

where t.employee_id &#61; s.employee_id;


3、内嵌视图小结

内嵌视图的特点在于无须创建真正的数据库对象&#xff0c;而只是封装查询&#xff0c;因此会节约数据资源&#xff0c;同时不会增加维护成本。但是内嵌视图不具有可复用性&#xff0c;因此当预期将在多处调用到同一查询定义时&#xff0c;还是应该使用关系视图。

内嵌视图之所以成为内嵌&#xff0c;是因为她总是出现在较复杂的查询中&#xff0c;而其外层查询问往往被称为父查询&#xff0c;因此&#xff0c;内嵌视图也可以看做子查询。

内嵌视图在处理大数据量查询时&#xff0c;不具有优势。相对来说&#xff0c;使用临时表反而是更好的选择。临时表作为实实在在存在的数据库对象&#xff0c;可以通过创建索引等手段来更好的提高性能&#xff0c;这正是视图所不具备的。

总之&#xff0c;内嵌视图的优点是&#xff1a;节省数据库资源&#xff0c;不增加维护成本&#xff1b;而缺点是&#xff0c;不可复用&#xff0c;以及大数据量的查询效率低下等。


来源&#xff1a;http://blog.csdn.net/liuxinsysu/article/details/51165089


推荐阅读
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
author-avatar
mobiledu2502855757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有