热门标签 | 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


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
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社区 版权所有