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


推荐阅读
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Oracle 用户锁定问题及解决方法
    本文介绍了如何在 Oracle 数据库中检查和处理用户锁定问题,包括查询被锁定的用户、解锁用户以及调整登录失败次数限制的方法。 ... [详细]
  • 周排行与月排行榜开发总结
    本文详细介绍了如何在PHP中实现周排行和月排行榜的开发,包括数据库设计、数据记录和查询方法。涉及的知识点包括MySQL的GROUP BY、WEEK和MONTH函数。 ... [详细]
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在使用达梦数据库时,管理员可能会遇到连接频繁中断或特定SQL语句语法错误的问题。这些问题通常源于开发人员在创建对象时的不规范操作。为了解决这些问题,建议对数据库配置进行优化,并确保所有SQL语句符合达梦数据库的标准语法。此外,定期检查和维护数据库连接参数,以及对异常日志进行详细分析,也有助于及时发现并解决问题。 ... [详细]
  • 数据仓库ETL开发过程中,如何有效进行测试是一个关键问题。由于数据仓库通常包含大量数据,并且出于安全考虑,开发库和测试库的数据与生产库不完全一致,这给测试带来了挑战。本文将探讨适用于ETL开发的测试方法,包括单元测试、集成测试以及具体测试技术。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 两个条件,组合控制#if($query_string~*modviewthread&t(&extra(.*)))?$)#{#set$itid$1;#rewrite^ ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
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社区 版权所有