《零点起飞学oracle之使用视》由会员分享,可在线阅读,更多相关《零点起飞学oracle之使用视(44页珍藏版)》请在金锄头文库上搜索。
1、第第1 10 0章章 使用视图使用视图 视图在Oracle中应用很普遍。视图在数据库中可以 看作是一张虚拟的表。使用视图可以补充表结构 在某些需求方面的不足,可以让开发人员更方便 地查询复杂数据。本章主要讲解视图定义、关系 视图的创建和使用、内嵌视图的使用、对象视图 的使用、物化视图的使用。 10.1 10.1 视图简介视图简介 在Oracle中,视图可以实现集中、简化数据库的作 用,同时还可以提供安全保证。用户可以像操作 普通表一样操作视图。视图往往不占用数据库额 外的存储空间,而只存储定义。 10.1.1 10.1.1 视图定义视图定义 视图是从一个或者多个表中导出的表,其结构和 数据都是
2、建立在对表的查询基础上的。和真实的 表一样,视图也包括多个被定义的数据列和多个 数据行。从本质上讲,这些数据列和数据行来自 于其所引用的表,视图本身不包含数据,它只是 一个查询语句的结果,所有数据最终是从表中获 取的,通常可以将这些称为源表或基表。 10.1.1 10.1.1 视图定义视图定义 视图不是真实存在的基础表而是一个虚拟表。视图所对应 的数据并不是实际地以视图结构存储在数据库中,而是存 储在视图所引用的表中。从关系代数理论上来说,数据表 可以看作关系。这种关系往往代表了现实世界的真实实 体。而关系可以通过各种运算(如交、差、并、投影)来 获得新的关系。 在查询员工职位信息状况的实例中
3、,可以通过表之间的关 系运算来获得所需的结果集合。而该结果集则具有临时性 ,一旦使用完毕,即可“丢弃”。这些结果数据,并不形成 真正的数据表,也不会持久化到数据库中。视图也不存储 查询的结果,但是存储了查询的定义。也就是说,对于关 系运算的运算步骤进行存储。因此,视图的本质就是关系 运算的定义。 10.1.2 10.1.2 为什么使用视图为什么使用视图 视图有很多优点,主要表现在大致两个方面上。 1封装查询 数据库虽然可以存储海量数据,但是在数据表设计上 却不可能为每种关系创建数据表。因为这种做法很明 显的造成了数据库中数据的大量冗余。视图则是解决 该问题的最佳策略。因为视图可以存储查询定义(
4、或 者说关系运算),那么,一旦使用视图存储了查询定 义,就如同存储了一个新的关系。用户可以直接对视 图中所存储的关系进行各种操作,就如同面对的是真 实的数据表。 10.1.2 10.1.2 为什么使用视图为什么使用视图 2. 灵活的控制安全性 一个数据表可能含有很多列。但是这些列的信息,对 于不同角色的用户,可访问的权限有可能不同。例如 ,在员工表中,可能存在着员工工号、员工姓名、员 工年龄、员工职位、员工家庭住址、员工社会关系等 信息。对于普通用户(例如普通员工),有可能需要 访问员工表,来查看某个工号的员工的姓名、职位等 信息,而不允许查看家庭住址、社会关系等信息;对 于高级用户(例如人事
5、经理),则需要关注所有信 息。那么,这就涉及到数据表的安全性。 利用视图可以灵活的实现这一策略。 10.2 10.2 关系视图关系视图 Oracle数据库中,视图可以分成这样几种类型,关 系视图、内嵌视图、对象视图和物化视图。关系 视图是虚拟表,同时也是最常用的视图。关系视 图可以看作对简单或复杂查询的定义,这种视图 允许开发者在数据库字典中查看它的信息。 10.2.1 10.2.1 创建关系视图创建关系视图 视图是由select子查询语句定义的,基于一个或多个表的逻 辑表。视图的创建比较简单。Oracle视图是作为数据库对 象存在的,因此,创建之后也可以通过工具或数据字典来 查看视图的相关信
6、息。 1创建关系视图 创建关系视图应该使用create view命令,其语法形式如下 所示。 create view 视图名称 as 查询语句|关系运算 其中,create view是创建关系视图的命令;其后紧跟视图 名称;as后面连接的是视图的查询定义(或者说关系运算 )。 【示例10-1】在数据库中存在着名为employees的数据表, 如欲创建针对普通用户的视图vw_e。该视图仅可访问表中 的department_id、first_name、hire_date、job_id。 10.2.1 10.2.1 创建关系视图创建关系视图 2查看视图定义 视图一旦创建,其定义即可存在于数据库中。可
7、 以通过SQL Developer的Views窗口来查看视图 VW_E在数据库中的信息。 数据字典user_view是Oracle数据库预定义的视图。 可以通过查询该视图的数据,来查看当前用户拥 有的所有视图信息。 10.2.2 10.2.2 使用关系视图使用关系视图 视图作为虚表,在一定的条件下可以像表一样完成数 据操纵的功能。使用视图进行数据操纵拥有更好的安 全性和灵活性。我们可以对视图进行插入、更新操 作。 1. 查询视图 查询视图的方法与查询表的方法是相同的。 【示例10-2】在创建了视图vw_e之后,即可利用查询 语句来获得视图中所包含的数据。 10.2.2 10.2.2 使用关系视
8、图使用关系视图 2. 更新视图数据 用户可以利用update语句来更新视图中的数据,而视 图本身并不存储数据。其数据来源于基础数据表。因 此,更新视图数据,实际是更新基础表中的数据。 【示例10-3】在员工视图vw_e中,更新视图。 10.2.2 10.2.2 使用关系视图使用关系视图 3查看关系视图修改功能 利用关系视图,除了插入数据和更新数据之外,还可 以删除其中数据。表面上看起来,可以通过视图对基 础表进行任何修改,但事实并非如此。我们可以做的 就是更新、插入、删除。 【示例10-5】Oracle内置视图user_updatable_columns定 义了用户视图中各列的可更新情况。 1
9、0.2.3 10.2.3 修改修改/ /删除视图删除视图 当系统中的视图不使用时,可以对其删除,以避免产 生大量的垃圾数据。也可以对已经存在的视图进行修 改,使其重新符合用户需求。 1修改视图 修改视图的过程即为重新定义视图的过程。视图创建 成功之后,数据库管理系统会允许开发人员修改创建 的视图。,Oralce了一个专门的命令create or replace view来重新定义视图。其语法形式如下所示。 create or replace view 视图名称 as 查询语句|关系运算 【示例10-6】假设现在需要为视图vw_e添加新列 employee_id。 10.2.3 10.2.3 修
10、改修改/ /删除视图删除视图 2删除视图 删除视图和删除其他数据库对象的操作方式是一样的 ,利用drop命令即可以完成相关的操作。其语法形式 如下所示。 drop view view_name 其中drop view向数据库发送删除视图命令; view_name则指定了要删除的视图名称。 【示例10-7】删除视图vw_e。 10.2.4 10.2.4 构建只读视图构建只读视图 通常情况下,创建的视图时允许进行DML操作的,但 这样容易出现逻辑问题,因为视图增加或更新数据实 际上是在操作视图的源表。有时,并不希望用户通过 视图修改数据,那么可以创建只读视图。创建只读视 图应该使用read onl
11、y选项,其基本语法形式如下所 示。 create or replace view 视图名称 as 查询语句 with read only 其中,with read only选项表示该视图将被创建为只读 视图。 【示例10-8】我们在10.2.3节中创建的视图vw_e不是只 读视图,通过该视图可以修改基础表employees中的数 据。同样可以利用read only选项将其创建为只读视 图。 10.2.5 10.2.5 构建联接视图构建联接视图 在实际应用中,更多的视图是基于多个基表的视图, 这样的视图能充分展示它的优点。对于这种数据可以 来源多个数据表或者其他视图的情况创建的视图就是 联接视图
12、。 【示例10-9】可以利用create or replace view来定义一 个联接视图,只是视图定义更加复杂而已。在表 employees与表jobs中分别定义了员工与工资信息,那 么我们可以利用create or replace view来创建视图。 10.2.6 10.2.6 强制创建视图强制创建视图 Oracle视图的一个突出特点是可以在没有源表时,也 允许创建视图,但是这种情况下,视图虽然是创建了 ,但是还不能使用。等到它的源表创建完成之后,就 可以正常使用了。 【示例10-10】例如,开发者预期有名为sales的数据表 ,该表至少包含以下四列,product_id、produc
13、t_time 、product_count、ssistant_id。 现欲创建一个名为vw_sales的视图,该视图仅包含以 下列product_id、product_time、product_count和 ssistant_id列。但是,视图创建者无权创建实际的数据 表,但又不能等待表的预期创建者的工作。此时,可 以使用force选项来强制创建视图。 10.2.6 10.2.6 强制创建视图强制创建视图 利用force选项强制创建视图的语法如下所示。 create or replace force view视图名称 as 查询语句|关系 运算 在SQL Developer中强制创建视图vw_
14、sales。 10.2.7 10.2.7 创建视图约束创建视图约束 当视图创建完成后,可以对其约束进行添加、删除、 修改操作。针对视图,Oracle提供了check option选项 ,以保证视图数据的完整性。 1where子句情况 with check option仅在视图定义中含有where子句的情 况下起作用。with check option选项可以保证视图数据 完整性。 【示例10-11】首先修改视图vw_e的定义只选择员 工id小于109的记录。同时使用with check option选项。 10.2.7 10.2.7 创建视图约束创建视图约束 2. insert/update操
15、作 with check option选项并非对所有DML操作均起作用, 而只针对insert/update操作有效。在试验了update操作 之后,可以再次测试对insert操作的影响。 【示例10-12】尝试向视图vw_em中插入employee_id为 209的数据。 10.2.7 10.2.7 创建视图约束创建视图约束 3. 创建了一个约束 with check option选项实际为视图创建了一个约束。约 束是对表或视图中的数据进行限制的一种数据库对 象。关于约束的详细信息,可以参考第11章的内容。 【示例10-13】Oracle提供了数据字典user_constraints, 该视
16、图可以查看用户创建的所有约束。通过该视图, 可以查询到with check option所创建的约束。 10.310.3 内嵌视图内嵌视图 内嵌视图不需要视图名称,只是一段SQL语句,通常 在子查询中作为一个中间的数据集,它可以在增加、 删除、修改操作中使用。 10.3.1 10.3.1 什么是内嵌视图什么是内嵌视图 内嵌视图定义嵌入在复杂查询语句中,其角色与普通 数据表或关系视图相同。内嵌视图不必使用create view命令进行创建。因此,在数据字典中也无法获得 相应信息。内嵌视图是子查询的一种,可以与数据 表、视图一样作为查询语句的数据源存在,但在形式 上有较大的区别。 数据表和关系视图作为数据源,只需要出现对象名称 即可,而内嵌视图则是以SQL查询语句的形式存在。 10.3.2 10.3.2 使用内嵌视图使用内嵌视图 内嵌视图不属于任何用户,也不是对象,内嵌视图是 子查询的一种。内嵌视图的特点在于无须