《第7章--视图-Oracle数据库-电子教案()课件.ppt》由会员分享,可在线阅读,更多相关《第7章--视图-Oracle数据库-电子教案()课件.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 视图视图视图是数据库中特有的对象。视图用于存储查询,但视图是数据库中特有的对象。视图用于存储查询,但不会存储数据(物化视图除外)。这是视图和数据表的重不会存储数据(物化视图除外)。这是视图和数据表的重要区别。可以利用视图进行查询、插入、更新和删除数据。要区别。可以利用视图进行查询、插入、更新和删除数据。OracleOracle中有中有4 4种视图:种视图:l关系视图;关系视图;l内嵌视图;内嵌视图;l对象视图;对象视图;l物化视图。物化视图。7.1 7.1 关系视图关系视图关系视图是四种视图中最简单,同时也是最常用的视关系视图是四种视图中最简单,同时也是最常用的视图。读者可以将
2、关系视图看作对简单或复杂查询的定义。图。读者可以将关系视图看作对简单或复杂查询的定义。它的输出可以看作一个虚拟的表,该表的数据是由其他基它的输出可以看作一个虚拟的表,该表的数据是由其他基础数据表提供的。由于关系视图并不存储真正的数据,因础数据表提供的。由于关系视图并不存储真正的数据,因此占用数据库资源也较少。此占用数据库资源也较少。7.1.1 7.1.1 建立关系视图建立关系视图1 1创建关系视图创建关系视图create view vw_employees as select employee_id,last_name|first_name as employee_name,province|
3、-|city as location from employees2 2查看视图定义查看视图定义select text from user_views where view_name=VW_EMPLOYEES 3 3查看视图内容查看视图内容select*from vw_employees7.1.2 7.1.2 修改修改/删除视图删除视图1 1修改视图(为视图添加新列修改视图(为视图添加新列SALARYSALARY)create or replace view vw_employees as select employee_id,last_name|first_name as employee_
4、name,province|-|city as location,salary from employees 2 2删除视图删除视图drop view vw_employees7.1.4 7.1.4 编译视图编译视图视图依赖于基础表的存在而存在,当基础表进行了结视图依赖于基础表的存在而存在,当基础表进行了结构上的调整,有可能会对视图产生影响。如欲再次使用该构上的调整,有可能会对视图产生影响。如欲再次使用该视图,必须对视图进行重新编译。视图,必须对视图进行重新编译。alter view vw_employee_salary compile7.1.5 7.1.5 使用使用forceforce选项强
5、制创建视图选项强制创建视图有时,视图的基础表还没有创建,但是仍然希望能够有时,视图的基础表还没有创建,但是仍然希望能够创建基于不存在的数据表的视图。这是因为,数据表的预创建基于不存在的数据表的视图。这是因为,数据表的预期创建者和视图的创建者并非同一用户。视图创建者不希期创建者和视图的创建者并非同一用户。视图创建者不希望等待基础表创建者的工作完成之后才进行自己的工作。望等待基础表创建者的工作完成之后才进行自己的工作。假设,此时视图创建者已经对基础表的结构有了清晰的概假设,此时视图创建者已经对基础表的结构有了清晰的概念,例如念,例如booksbooks将被创建,以存储图书信息。将被创建,以存储图书
6、信息。create or replace force view vw_books asselect book_name,authorfrom books7.1.6 7.1.6 利用视图更新数据表利用视图更新数据表通过视图,不但可以对基础表中的数据进行查询,而通过视图,不但可以对基础表中的数据进行查询,而且可以对数据表中的数据进行更新。更新的方式非常简单且可以对数据表中的数据进行更新。更新的方式非常简单直接更新视图中的数据即可将对基础表进行相应的更直接更新视图中的数据即可将对基础表进行相应的更新。当然,并非视图中的所有列都能够进行更新,并反映新。当然,并非视图中的所有列都能够进行更新,并反映到基
7、础表中。只有那些直接由基础表获得的列可以进行更到基础表中。只有那些直接由基础表获得的列可以进行更新操作,如范例新操作,如范例7-57-5中的列中的列book_namebook_name和列和列authorauthor;而由基;而由基础表中的数据经过运算获得,仅凭视图中的数据无法判断础表中的数据经过运算获得,仅凭视图中的数据无法判断基础表中的数据情况的列,不能进行更新,基础表中的数据情况的列,不能进行更新,vw_employeesvw_employees中的中的namename列。列。select table_name,column_name,updatable,insertable,delet
8、able from user_updatable_columns where table_name=VW_BOOKSinsert into vw_books values(千年一叹,余秋雨)7.1.8 7.1.8 关系视图小结关系视图小结1 1保障数据安全性保障数据安全性2 2数据整合数据整合3 3数据透明性数据透明性7.2 7.2 内嵌视图内嵌视图关系视图作为查询定义,一旦创建,即可存在于数据关系视图作为查询定义,一旦创建,即可存在于数据库中,并可被多次使用。但有时,需要某个视图作为过渡库中,并可被多次使用。但有时,需要某个视图作为过渡结果集,但在一次使用之后,便不再需要,此时不宜创建结果集
9、,但在一次使用之后,便不再需要,此时不宜创建关系视图。因为关系视图占用数据库资源,而且也会增加关系视图。因为关系视图占用数据库资源,而且也会增加维护成本。此时应该选择使用内嵌视图。维护成本。此时应该选择使用内嵌视图。7.2.2 7.2.2 内嵌视图的使用内嵌视图的使用1 1利用内嵌视图进行查询利用内嵌视图进行查询select*from(select employee_id,last_name|first_name employee_name,salary from employees order by salary desc)where rownum=32 2利用内嵌视图更新数据表利用内嵌视图
10、更新数据表7.3 7.3 对象视图对象视图目前,数据库都是关系型数据库,但是,面向对象编目前,数据库都是关系型数据库,但是,面向对象编程的思想早已深入人心。程的思想早已深入人心。OracleOracle数据库不仅可以通过关系数据库不仅可以通过关系表来存储数据,同样,也可以创建对象,以对象的方式进表来存储数据,同样,也可以创建对象,以对象的方式进行数据存储。关系视图是由关系表进行查询获得的,而对行数据存储。关系视图是由关系表进行查询获得的,而对象视图则是对对象进行查询获得的。象视图则是对对象进行查询获得的。7.3.1 7.3.1 对象视图简介对象视图简介说到对象视图,自然应该首先提到对象。说到对
11、象视图,自然应该首先提到对象。OracleOracle中的中的对象仍然是一个逻辑概念,虽然可以从对象中获取数据,对象仍然是一个逻辑概念,虽然可以从对象中获取数据,就像数据真实存储于对象中一样。但是在对象的概念之下,就像数据真实存储于对象中一样。但是在对象的概念之下,数据仍然是存储于关系表中的。要创建对象,首先要建立数据仍然是存储于关系表中的。要创建对象,首先要建立对象类型,类似于对象类型,类似于JavaJava或或C#C#中类的概念中类的概念7.4 7.4 物化视图物化视图前面所讲述的三种视图前面所讲述的三种视图关系视图、内嵌视图和对关系视图、内嵌视图和对象视图,实际都是通过定制查询,并利用查
12、询定义来获取象视图,实际都是通过定制查询,并利用查询定义来获取数据。三种视图都不会直接存储数据,每次操作时,都会数据。三种视图都不会直接存储数据,每次操作时,都会进行编译。本节讲述另外一种视图进行编译。本节讲述另外一种视图物化视图。物化视图。7.4.1 7.4.1 物化视图简介物化视图简介物化视图是物理化视图的简称,顾名思义,该视图存物化视图是物理化视图的简称,顾名思义,该视图存储实际数据,因此,会占用一定的数据库空间。在这一点储实际数据,因此,会占用一定的数据库空间。在这一点上,更接近于临时表。但不像临时表那样在某个特定的时上,更接近于临时表。但不像临时表那样在某个特定的时机会删除数据。物化
13、视图中的数据是可重用的,因此,经机会删除数据。物化视图中的数据是可重用的,因此,经常应用于读取频繁的场合。常应用于读取频繁的场合。物化视图对于大数据表的处理显得尤为重要。为了统物化视图对于大数据表的处理显得尤为重要。为了统计一个拥有百万级记录的数据表的总和及平均值问题,将计一个拥有百万级记录的数据表的总和及平均值问题,将耗费大量数据库资源和时间。可以通过物化视图改善这一耗费大量数据库资源和时间。可以通过物化视图改善这一状况。即,对表进行一次统计,并将统计结果存储在物化状况。即,对表进行一次统计,并将统计结果存储在物化视图中,那么,以后的每次查询直接查询该视图即可。视图中,那么,以后的每次查询直
14、接查询该视图即可。7.4.2 7.4.2 物化视图的使用物化视图的使用1 1创建物化视图创建物化视图create materialized view mv_monthly_salesbuild immediaterefresh on commitenable query rewriteas select sale_month,sum(price*quantity)from employee_sale_details group by sale_month2 2查看物化视图信息查看物化视图信息select object_name,object_type,status from user_obje
15、cts where object_name=MV_MONTHLY_SALES7.4.3 7.4.3 物化视图的数据加载物化视图的数据加载在范例在范例7-157-15创建物化视图的创建物化视图的SQLSQL语句中使用了语句中使用了build build immediateimmediate。该选项用于立即加载物化视图的数据。也就是。该选项用于立即加载物化视图的数据。也就是说,在创建物化视图的同时,立即根据定义从基础表中获说,在创建物化视图的同时,立即根据定义从基础表中获取数据,并将数据添加到物化视图中。另外一个可用选项取数据,并将数据添加到物化视图中。另外一个可用选项为为build deffer
16、edbuild deffered,表示延迟载入数据。,表示延迟载入数据。使用延迟加载是必要的。有时,物化视图的基础表数使用延迟加载是必要的。有时,物化视图的基础表数据量巨大,载入数据会耗费大量资源。直接使用立即加载据量巨大,载入数据会耗费大量资源。直接使用立即加载策略,在数据库使用高峰期,会造成客户端的延迟。但是,策略,在数据库使用高峰期,会造成客户端的延迟。但是,后续的开发工作可能使用到该物化视图,那么可以采用延后续的开发工作可能使用到该物化视图,那么可以采用延迟加载数据的策略。迟加载数据的策略。7.4.4 7.4.4 物化视图的数据更新物化视图的数据更新物化视图的数据应该根据基础表的更新而
17、更新。范例物化视图的数据应该根据基础表的更新而更新。范例7-157-15创建物化视图的创建物化视图的SQLSQL语句中使用了语句中使用了refresh on commitrefresh on commit,要求,要求OracleOracle实现自动更新的功能。即基础表的数据更新实现自动更新的功能。即基础表的数据更新被提交后,应该自动更新物化视图的数据。被提交后,应该自动更新物化视图的数据。7.5 7.5 本章小结本章小结本章讲述了本章讲述了OracleOracle中的四种视图:关系视图、内嵌视中的四种视图:关系视图、内嵌视图、对象视图和物化视图。其中关系视图是最常用的视图。图、对象视图和物化视
18、图。其中关系视图是最常用的视图。关系视图在安全性、组合数据及增强性能方面都有着极为关系视图在安全性、组合数据及增强性能方面都有着极为广泛的应用。内嵌视图则无需真正创建一个视图对象,而广泛的应用。内嵌视图则无需真正创建一个视图对象,而更接近于临时视图,具有运行时有效的特点,使内嵌视图更接近于临时视图,具有运行时有效的特点,使内嵌视图使用起来非常灵活、方便。使用起来非常灵活、方便。组装数据;组装数据;封装复杂查询;封装复杂查询;提供建模模型;提供建模模型;提高响应速度。提高响应速度。7.6 7.6 本章实例本章实例本章主要讲述了视图的创建和使用。在本章主要讲述了视图的创建和使用。在OracleOr
19、acle数据库数据库中,本身存在着若干已创建的视图。这些视图可以用来获中,本身存在着若干已创建的视图。这些视图可以用来获取许多重要信息。例如,为了获得数据库中,某个表的所取许多重要信息。例如,为了获得数据库中,某个表的所有列,即可利用视图有列,即可利用视图user_tab_colsuser_tab_cols。该范例演示了如何获得某个表该范例演示了如何获得某个表/视图的所有列。视图的所有列。select table_name,column_name,data_type from user_tab_cols where lower(table_name)=booksselect table_name,column_name,data_type from user_tab_cols where lower(table_name)=vw_employee_salary7.7 7.7 习题习题1 1视图共分为哪几种?视图共分为哪几种?2 2何时应当使用内嵌视图?何时应当使用内嵌视图?3 3简述对象视图的主要特点。简述对象视图的主要特点。4 4简述物化视图的主要特点。简述物化视图的主要特点。5 5如何获得数据库中某个用户的所有对象名称?如何获得数据库中某个用户的所有对象名称?
限制150内