第六章视图1.概述视图(View)是从一个或多个表(其他视图)中导出的表,其结构和数据是建立在对表的查询基础之上的。所以视图不是真实存在的基础表,而是一张虚表。视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。视图一经定义便存储在数据库中,与其相对应的数据并没有像表一样在数据库中另外存储一份,通过视图看到的数据只是存放在基表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)和删除。当对视图中的数据进行修改时,相应的基表的数据也要发生变化,同时,如果基表的数据发生变化,则这种变化也可以自动地反映到视图中2.视图的特点1.视点集中,减少对象大小视图让用户能够着重于他们所需要的特定数据或所负责的特定要求,如用户可以选择特定行或特定列。2.从异构源组织数据可以在连接两个或多个表的复杂查询的基础上创建视图,这样可以将单个表显示给用户。3.隐藏数据的复杂性,简化操作视图向用户隐藏了数据库设计的复杂性,这样如果开发者改变数据库设计,不会影响到用户与数据库交互。另外,用户可将经常使用的连接查询、嵌套查询或联合查询定义为视图。4.简化用户权限的管理可以将视图的权限授予用户,而不必将基表中某些列的权限授予用户,这样就简化了用户权限的定义。3.视图的四种类型关系视图:关系视图(relationalview)基本上就是经过存储的查询,可以将它的输出看作是一个表。它就是基于关系数据的存储对象。内嵌视图:又称为嵌套查询,是嵌入到父查询中的查询,能够在任何可以使用表名称的地方使用。对象视图:为了迎合数据库中对象类型而将关系表投射到特定数据类型的虚拟对象表中,视图的每行都是带有属性、方法和唯一标识(OID)的对象实例。物化视图:就是在数据库中查询结果存储在视图中,并支持查询重写、刷新、提交等特性的视图4.视图的创建及管理a)关系视图语法:CREATE[ORREPLACE][FORCE]VIEWview_name[(alias[,alias]...)]ASselect_statement[WITHCHECKOPTION[CONSTRAINTconstraint]][WITHREADONLY]注意:普通用户并没有创建视图的权限,如果要创建视图,需要使用dba角色的用户赋予createview的权限查看视图可以通过User_views,All_views,Dba_views来查询视图信息例如:Select*fromuser_views;--查看当前用户创建的视图1.创建普通关系视图【可对视图执行DML操作】2.创建只读视图特点:顾名思义,只读,不能执行其他DML操作createorreplaceviewview_empasselect*fromempwheresal=3000withreadonly;3.创建检查视图特点:执行DML操作时,自动检测是否满足创建视图时所建立的where条件,如果不满足,直接出错createorreplaceviewview_empasselect*fromempwheresal=3000withcheckoption;4.创建连接视图特点:连接视图是指基于多个表所创建的视图,即定义视图的查询是一个连接查询。使用连接视图的主要目的是为了简化连接查询。【只能更新键保留表】createorreplaceviewview_empasselecte.*,d.dnamefromempe,deptdwheree.deptno=d.deptno;--使用scott身份登录,创建视图emp表的简单视图createviewview_empasselect*fromemp;select*fromview_emp;updateview_empsetsal=3200wheresal=3000deleteview_empwhererownum=15.创建复杂视图特点:复杂视图是指包含函数、表达式或分组数据的视图,主要目的是为了简化查询createorreplaceviewview_empasselectcount(*)人数,avg(sal+nvl(comm,0))平均工资,deptno部门编号fromempgroupbydeptno;6.创建强制视图视图上的DML语句有如下限制:只能修改一个底层的基表如果修改违反了基表的约束条件,则无法更新视图如果视图包含连接操作符、DISTINCT关键字、集合操作符、聚合函数或GROUPBY子句,则将无法更新视图如果视图包含伪列或表达式,则将无法更新视图b)内嵌视图概述内嵌视图就是嵌入到父查询中的查询,能够在任何可以使用表名称的地方使用。内嵌视图又称为嵌套查询嵌视图可以出现在SELECT语句的FROM子句中,以及INSERTINTO、UPDATE甚至是DELETEFROM语句中。内嵌视图是临时的,它只存在于父查询的运行期间案例:c)对象视图d)物化视图概述:特点:正常情况下,如果基表不存在,创建视图就会失败。但是可以使用FORCE选项强制创建视图(前提是创建视图的语句没有语法错误),但此时该视图处于失效状态,调用会出错,直到这个基表已经存在createorreplaceFORCEviewview_testasselect*frommyemp;select*from(selecte.*,rownumrnfromempe)tabwherern=5andrn=10;其中:selecte.*,rownumrnfromempe就是一个内嵌视图,临时有效物化视图简单理解就是一张特殊的物理表,预先计算并保存表连接或统计中需要耗时较多的操作的结果。物化视图也称为”快照”物化视图可以定时更新视图中的数据,对于大量数据统计查询后得出的小量结果集这种情况比较适合。物化视图可以查询表,视图和其它的物化视图我们可以通过user_segments查看用户创建对象所在资源情况Select*fromuser_segments物化视图类型1.包含聚集的物化视图2.只包含连接的物化视图3.嵌套物化视图无论哪种视图,都需要设置物化视图的创建方式、查询重写、刷新方式等几个方面的功能选项。创建方式(BuildMethods)–BUILDIMMEDIATE:是在创建物化视图的时候就生成数据。默认为BUILDIMMEDIATE–BUILDDEFERRED:是在创建时不生成数据,以后根据需要在生成数据查询重写(QueryRewrite)–查询重写(ENABLEQUERYREWRITE):指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。不查询重写(DISABLEQUERYREWRITE):指当对物化视图的基表进行查询时,Oracle会不会判断能否通过查询物化视图来得到结果,直接对基表进行查询数据而不从物化视图中读取数据。默认为DISABLEQUERYREWRITE。刷新(Refresh)方式【自动oncommit,手动】–刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。默认值是FORCE。–刷新的模式有两种:ONDEMAND和ONCOMMIT。默认值是ONDEMAND创建视图日志文件如果设置刷新方法为fast,必须先构建一个基于基表的视图日志,语法如下:CREATEMATERIALIZEDVIEWLOGONtable_name[TABLESPACEtablespace_name]--视图日志保存位置[WITH[PRIMARYKEY|ROWID|SEQUENCE];--标示基表每一行[includingnewvalues]例如:创建物化视图语法CREATEMATERIALIZEDVIEW[mv_name][TABLESPACE[ts_name]--指定表空间BUILD[IMMEDIATE|DEFERRED]--创建时是否产生数据REFRESH[FAST|COMPLETE|FORCE]--快速、完全刷新[ONCOMMIT|ONDEMANDSTARTWITH(start_time)NEXT(next_time)]--刷新方式[WITH{PRIMARYKEY|ROWID}]--快速刷新时候唯一标示一条记录{ENABLE|DISABLED}QUERYREWRITE–是否查询重写]AS{select_statement};构建一个创建时产生数据,快速刷新【限制比较多】,刷新方式为oncommit,快速刷新是唯一标示为rowid的案例creatematerializedviewmy_viewbuildimmediaterefreshfastoncommitwithrowidasselectempno,ename,salfromempwheresal=3000;Rowid物化视图只有一个单一的主表,不能包括下面任何一项:Distinct或者聚合函数.Groupby,子查询,连接和SET操作构建一个创建时产生数据,默认刷新,刷新方式为oncommit,刷新是唯一标示为rowid,支持重写的案例creatematerializedviewmy_viewbuildimmediaterefreshoncommitenablequeryrewriteasselectdeptno,count(*)amountfrommyempgroupbydeptno;注意:包含聚集,groupby不能创建快速刷新创建一个定时提交的物化视图creatematerializedviewlogonempwithrowidcreatematerializedviewmy_viewrefreshstartwithsysdatenextsysdate+1/48withrowidasselectcount(*),avg(sal+nvl(comm,0))salsfrommyemp;使用聚合函数和分组时,不能使用快速刷新模式,该案例使用的是默认刷新方式手动刷新:begindbms_mview.refresh('MY_VIEW');end删除物化日志文件dropmaterializedviewlogonempd删除物化视图dropmaterializedviewmy_view;物化视图总结:物化视图提供了可伸缩的基于主键或ROWID的视图,指定了刷新方法和自动刷新的时间。Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新5.常用系统视图a)USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息。1.Select*fromuser_users;--查看当前用户信息2.Select*fromuser_tables;--查看当前用户创建表信息3.Select*fromuser_views;--查看当前用户创建视图信息4.select*fromuser_tab_privs—查看当前用户表权限5.select*fromuser_sys_privs;--查看当前用户系统6.select*fromuser_role_privs;--查看当前用户角色b)ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的信息加上其他用户创建的对象但该用户有权访问的信息。c)DBA_*:有关整个数据库中对象的信息。这里的*可以为TABLES,INDEXES,OBJECTS,USERS等。d)V$*:一般是动态视图,随着客户端或参数值设定的不同而不同6.