第十一章创建视图Copyright©OracleCorporation,2001.Allrightsreserved.创建视图进度表:时间主题20分钟讲演20分钟练习40分钟总共中国科学院西安网络中心©2005OracleSQL入门11-1第十一章创建视图11-2Copyright©OracleCorporation,2001.Allrightsreserved.目标完成本课后,您应当能够执行下列操作:•描述视图•创建视图,修改视图的定义,删除视图•通过视图取回数据•通过视图插入、更新和删除数据•创建和使用内嵌视图•执行“Top-N”分析课程目标在本课中,你将学习怎样创建和使用视图,你还将学习查询有关的数据字典对象来获得视图信息,昀后,你将学习创建和使用内嵌视图,并且用内嵌视图进行Top-N分析。中国科学院西安网络中心©2005OracleSQL入门11-2第十一章创建视图11-3Copyright©OracleCorporation,2001.Allrightsreserved.数据库对象说明基本存储单元;由行和列组成数据来自一个或者多个表的数据子集的逻辑表示产生主键的值改善某些查询的性能一个对象的替换名字对象Table(表)View(视图)Sequence(序列)Index(索引)Synonym(同义词)中国科学院西安网络中心©2005OracleSQL入门11-3第十一章创建视图11-4Copyright©OracleCorporation,2001.Allrightsreserved.什么是视图?EMPLOYEESTable:什么是视图?你可以通过创建表的视图来表现数据的逻辑子集或数据的组合。视图是基于表或另一个视图的逻辑表,一个视图并不包含它自己的数据,它象一个窗口,通过该窗口可以查看或改变表中的数据。视图基于其上的表称为基表。视图在数据字典中作为一个SELECT语句存储。教师注释演示:11_easyvu.sql目的:幻灯片上的视图显示由下面的语句创建:CREATEORREPLACEVIEWsimple_vuASSELECTemployee_id,last_name,salaryFROMemployees;中国科学院西安网络中心©2005OracleSQL入门11-4第十一章创建视图11-5Copyright©OracleCorporation,2001.Allrightsreserved.为什么用视图?•限制数据访问•使得复杂的查询容易•提供数据的独立性•表现相同数据的不同观察视图的优越性视图限制数据的访问,因为视图能够选择性的显示表中的列。视图可以用来构成简单的查询以取回复杂查询的结果。例如,视图能用于从多表中查询信息,而用户不必知道怎样写连接语句。视图对特别的用户和应用程序提供数据独立性,一个视图可以从几个表中取回数据。视图提供用户组按照他们的特殊标准访问数据。更多信息见Oracle9iSQLReference,“创建视图”。中国科学院西安网络中心©2005OracleSQL入门11-5第十一章创建视图11-6Copyright©OracleCorporation,2001.Allrightsreserved.简单视图和复杂视图特性简单视图复杂视图表的数目一个一个或多个包含函数无有包含数据分组无有通过视图进行DML操作是不允许简单视图VS复杂视图视图有两种分类:简单和复杂,基本区别涉及DML(INSERT、UPDATE和DELETE)操作。下面是简单视图:−数据仅来自一个表−不包含函数或数据分组−能通过视图执行DML操作下面是复杂视图:−数据来自多个表−包含函数或数据分组−不总是允许通过视图进行DML操作中国科学院西安网络中心©2005OracleSQL入门11-6第十一章创建视图11-7Copyright©OracleCorporation,2001.Allrightsreserved.创建视图•在CREATEVIEW语句中嵌入一个子查询•子查询可以包含复杂的SELECT语法CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview[(alias[,alias]...)]ASsubquery[WITHCHECKOPTION[CONSTRAINTconstraint]][WITHREADONLY[CONSTRAINTconstraint]];CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview[(alias[,alias]...)]ASsubquery[WITHCHECKOPTION[CONSTRAINTconstraint]][WITHREADONLY[CONSTRAINTconstraint]];创建查询你可以在CREATEVIEW语句中嵌入一个子查询来创建一个视图。在语法中:ORREPLACE如果视图已经存在重新创建它FORCE创建视图,而不管基表是否存在NOFORCE只在基表存在的情况下创建视图(这是默认值)view视图的名字alias为由视图查询选择的表达式指定名字(别名的个数必须与由视图选择的表达式的个数匹配)subquery是一个完整的SELECT语句(对于在SELECT列表中的字段你可以用别名)WITHCHECKOPTION指定只有可访问的行在视图中才能被插入或修改constraint为CHECKOPTION约束指定的名字WITHREADONLY确保在该视图中没有DML操作被执行中国科学院西安网络中心©2005OracleSQL入门11-7第十一章创建视图11-8Copyright©OracleCorporation,2001.Allrightsreserved.创建视图•创建一个视图,EMPVU80,其中包含了在部门80中雇员的详细信息•用iSQL*PlusDESCRIBE命令查看视图的结构DESCRIBEempvu80DESCRIBEempvu80CREATEVIEWempvu80ASSELECTemployee_id,last_name,salaryFROMemployeesWHEREdepartment_id=80;Viewcreated.Viewcreated.创建视图(续)幻灯片上的例子创建一个包含在部门80中所有雇员的雇员号、名字和薪水视图。你可以用iSQL*PlusDESCRIBE命令显示视图的结构。创建视图的原则:定义一个视图的子查询可以包含复杂的SELECT语法,包括连分组和多个字查询。定义视图的子查询不能包含ORDERBY子句,当你从视图取回数据时可以指定ORDERBY子句。如果你没有为用WITHCHECKOPTION选项创建的视图指定一个约束名字,系统将以SYS_Cn格式指定一个默认的名字。你可以用ORREPLACE选项改变视图的定义而无须删除和重新创建它,或重新授予以前已经授予它的对象权限。中国科学院西安网络中心©2005OracleSQL入门11-8第十一章创建视图11-9Copyright©OracleCorporation,2001.Allrightsreserved.创建视图•用子查询中的列别名创建视图•从该视图中选择列,视图中的列使用别名命名CREATEVIEWsalvu50ASSELECTemployee_idID_NUMBER,last_nameNAME,salary*12ANN_SALARYFROMemployeesWHEREdepartment_id=50;Viewcreated.Viewcreated.创建视图(续)你可以在子查询中包括列别名来控制列名。幻灯片中的例子创建一个视图,包含部门50中的每个雇员的雇员号(EMPLOYEE_ID),别名是ID_NUMBER;名字(LAST_NAME),别名是NAME;年薪(SALARY),别名是ANN_SALARY。作为一个选择,你可以在CREATE语句后面在SELECT子查询前面用一个别名,被列出的别名的个数必须与在子查询中被选择的表达式相匹配。CREATEVIEWsalvu50(ID_NUMBER,NAME,ANN_SALARY)ASSELECTemployee_id,last_name,salary*12FROMemployeesWHEREdepartment_id=50;视图创建。教师注释让学生知道关于被物化的视图或快照,术语快照(snapshot)和物化视图(materializedview)是同义词。两者都涉及包含一个或多个表的查询结果的表,它们中的每一个都可能被定位于同一个数据库或者一个远程数据库上。在查询中的表被称为主表或细节表。包含主表的数据库称为主数据库。关于物化视图的更多信息可参考:Oracle9iSQLReference,“创建物化视图/快照”。中国科学院西安网络中心©2005OracleSQL入门11-9第十一章创建视图11-10Copyright©OracleCorporation,2001.Allrightsreserved.从视图中取回数据SELECT*FROMsalvu50;从视图中取回数据你可以象从任何表中取回数据一样从视图取回数据,你既可以显示整个视图的内容,也可以仅显示指定的行和列。中国科学院西安网络中心©2005OracleSQL入门11-10第十一章创建视图11-11Copyright©OracleCorporation,2001.Allrightsreserved.查询视图USER_VIEWSUSER_VIEWSEMPVU80EMPVU80SELECTemployee_id,last_name,salaryFROMemployeesWHEREdepartment_id=80;iSQL*PlusSELECT*FROMempvu80;OracleOracle服务器服务器EMPLOYEES数据字典中的视图一旦视图被创建,你就可以查询数据字典视图USER_VIEWS来看视图的名字和视图定义。构成视图的SELECT语句的文本被存储在一个LONG列中。用视图存取数据当你用视图存取数据时,Oracle服务器执行下面的操作:1.从数据字典表USER_VIEWS中取回视图定义。2.检查对视图的基表的数据存取权限。3.转换视图查询为一个在基表或表上的等价操作,换句话说,数据从基表得到,或更新基表。中国科学院西安网络中心©2005OracleSQL入门11-11第十一章创建视图11-12Copyright©OracleCorporation,2001.Allrightsreserved.修改视图•用CREATEORREPLACEVIEW子句,为每个列添加一个别名•在CREATEVIEW子句中的字段别名列表,按照与子查询中的字段相同的顺序排列CREATEORREPLACEVIEWempvu80(id_number,name,sal,department_id)ASSELECTemployee_id,first_name||''||last_name,salary,department_idFROMemployeesWHEREdepartment_id=80;Viewcreated.Viewcreated.修改视图用ORREPLACE选项,允许创建视图时同名的视图已经存在,这样旧版本的视图会被替换,这意味着视图可以在不被删除、重新创建和再次授予对象权限的情况下修改。注:当在CREATEVIEW子句中指定列别名时,不要望了别名的列表顺序与子查询的列顺序一样。教师注释ORREPLACE选项是从Oracle7开始有的,用Oracle的早期版本,如果要改变视图,先要删除旧视图,再重新创建。演示:11_emp.sql目的:举例说明用别名创建视图中国科学院西安网络中心©2005OracleSQL入门11-12第十一章创建视图11-13Copyright©OracleCorporation,2001.Allrightsreserved.创建复杂视图创建包含组函数的复杂视图,以从两个表中显示值CREATEVIEWdept_sum_vu(n