转载:http://heisetoufa.iteye.com/blog/364864
视图的概念
视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只 是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。通过视图来查看表,就像是从不同的角度来观察一个(或多个)表。
视图有如下一些优点:
* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。
* 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。
* 一个视图可以检索多张表的数据,因此用户通过访问一个视图,可完成对多个表的访问。
* 视图是相同数据的不同表示,通过为不同的用户创建同一个表的不同视图,使用户可分别访问同一个表的不同部分。
视图可以在表能够使用的任何地方使用,但在对视图的操作上同表相比有些限制,特别是插入和修改操作。对视图的操作将传递到基表,所以在表上定义的约束条件和触发器在视图上将同样起作用。
视图的创建
创建视图需要CREAE VIEW系统权限,视图的创建语法如下:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名[(别名1[,别名2...])]
AS 子查询
[WITH CHECK OPTION [CONSTRAINT 约束名]]
[WITH READ ONLY]
其中:
OR REPLACE 表示替代已经存在的视图。
FORCE表示不管基表是否存在,创建视图。
NOFORCE表示只有基表存在时,才创建视图,是默认值。
别名是为子查询中选中的列新定义的名字,替代查询表中原有的列名。
子查询是一个用于定义视图的SELECT查询语句,可以包含连接、分组及子查询。
WITH CHECK OPTION表示进行视图插入或修改时必须满足子查询的约束条件。后面的约束名是该约束条件的名字。
WITH READ ONLY 表示视图是只读的。
删除视图的语法如下:
DROP VIEW 视图名;
删除视图者需要是视图的建立者或者拥有DROP ANY VIEW权限。视图的删除不影响基表,不会丢失数据。
1.创建简单视图
创建图书作者视图。
步骤1:创建图书作者视图:
- CREATE VIEW 图书作者(书名,作者)
- AS SELECT 图书名称,作者 FROM 图书;
输出结果:
视图已建立。
步骤2:查询视图全部内容
- SELECT * FROM 图书作者;
输出结果:
- 书名 作者
- -------------------------------- --------------------
- 计算机原理 刘勇
- C语言程序设计 马丽
- 汇编语言程序设计 黄海明
步骤3:查询部分视图:
- SELECT 作者 FROM 图书作者;
输出结果:
- 作者
- ----------
- 刘勇
- 马丽
- 黄海明
说明:本训练创建的视图名称为“图书作者”,视图只包含两列,为“书名”和“作者”,对应图书表的“图书名称”和“作者”两列。如果省略了视图名 称后面的列名,则视图会采用和表一样的列名。对视图查询和对表查询一样,但通过视图最多只能看到表的两列,可见视图隐藏了表的部分内容。
创建清华大学出版社的图书视图。
步骤1:创建清华大学出版社的图书视图:
- CREATE VIEW 清华图书
AS SELECT 图书名称,作者,单价 FROM 图书 WHERE 出版社编号= '01';
执行结果:
视图已建立。
步骤2:查询图书视图:
- SELECT * FROM 清华图书;
执行结果:
- 图书名称 作者 单价
- -------------------------------------------- ---------- -----------------------
- 计算机原理 刘勇 25.3
步骤3:删除视图:
- DROP VIEW 清华图书;
执行结果:
视图已丢掉。
说明:该视图包含了对记录的约束条件。
2.创建复杂视图
修改作者视图,加入出版社名称。
步骤1:重建图书作者视图:
- CREATE OR REPLACE VIEW 图书作者(书名,作者,出版社)
- AS SELECT 图书名称,作者,出版社名称 FROM 图书,出版社
- WHERE 图书.出版社编号=出版社.编号;
输出结果:
视图已建立。
步骤2:查询新视图内容:
- SELECT * FROM 图书作者;
输出结果:
- 书名 作者 出版社
- -------------------------------------------- ---------- ----------------------------
- 计算机原理 刘勇 清华大学出版社
- C语言程序设计 马丽 电子科技大学出版社
- 汇编语言程序设计 黄海明 电子科技大学出版社
说明:本训练中,使用了OR REPLACE选项,使新的视图替代了同名的原有视图,同时在查询中使用了相等连接,使得视图的列来自于两个不同的基表。
创建一个统计视图。
步骤1:创建emp表的一个统计视图:
- CREATE VIEW 统计表(部门名,最大工资,最小工资,平均工资)
- AS SELECT DNAME,MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP E,DEPT D
- WHERE E.DEPTNO=D.DEPTNO GROUP BY DNAME;
执行结果:
视图已建立。
步骤2:查询统计表:
- SELECT * FROM 统计表;
执行结果:
- 部门名 最大工资 最小工资 平均工资
- -------------------------- --------------- ----------------- ------------------
- ACCOUNTING 5000 1300 3050
- RESEARCH 3000 800 2175
- SALES 2850 950 1566.66667
说明:本训练中,使用了分组查询和连接查询作为视图的子查询,每次查询该视图都可以得到统计结果。
创建只读视图
创建只读视图要用WITH READ ONLY选项。
创建只读视图。
步骤1:创建emp表的经理视图:
- CREATE OR REPLACE VIEW manager
- AS SELECT * FROM emp WHERE job= 'MANAGER'
- WITH READ ONLY;
执行结果:
视图已建立。
步骤2:进行删除:
- DELETE FROM manager;
执行结果:
ERROR 位于第 1 行:
ORA-01752: 不能从没有一个键值保存表的视图中删除
4.创建基表不存在的视图
正常情况下,不能创建错误的视图,特别是当基表还不存在时。但使用FORCE选项就可以在创建基表前先创建视图。创建的视图是无效视图,当访问无效视图时,Oracle将重新编译无效的视图。
使用FORCE选项创建带有错误的视图:
- CREATE FORCE VIEW 班干部 AS SELECT * FROM 班级 WHERE 职务 IS NOT NULL;
执行结果:
警告: 创建的视图带有编译错误。
视图的操作
对视图经常进行的操作是查询操作,但也可以在一定条件下对视图进行插入、删除和修改操作。对视图的这些操作最终传递到基表。但是对视图的操作有很多限定。如果视图设置了只读,则对视图只能进行查询,不能进行修改操作。
1.视图的插入
视图插入练习。
步骤1:创建清华大学出版社的图书视图:
- CREATE OR REPLACE VIEW 清华图书
- AS SELECT * FROM 图书 WHERE 出版社编号= '01';
执行结果:
视图已建立。
步骤2:插入新图书:
- INSERT INTO 清华图书 VALUES('A0005','软件工程','01','冯娟',5,27.3);
执行结果:
已创建 1 行。
步骤3:显示视图:
- SELECT * FROM 清华图书;
执行结果:
- 图书 图书名称 出 作者 数量 单价
- -------- ---------------------------------------- ----------- -------- ------------------------ --------------
- A0001 计算机原理 01 刘勇 5 25.3
- A0005 软件工程 01 冯娟 5 27.3
步骤4:显示基表
- SELECT * FROM 图书;
执行结果:
- 图书 图书名称 出 作者 数量 单价
- -------- ------------------------------------------ ------- ---------------- ----------------- ---------------
- A0001 计算机原理 01 刘勇 5 25.3
- A0002 C语言程序设计 02 马丽 1 18.75
- A0003 汇编语言程序设计 02 黄海明 15 20.18
- A0005 软件工程 01 冯娟 5 27.3
说明:通过查看视图,可见新图书插入到了视图中。通过查看基表,看到该图书也出现在基表中,说明成功地进行了插入。新图书的出版社编号为“01”,仍然属于“清华大学出版社”。
但是有一个问题,就是如果在“清华图书”的视图中插入其他出版社的图书,结果会怎么样呢?结果是允许插入,但是在视图中看不见,在基表中可以看见,这显然是不合理的。
2.使用WITH CHECK OPTION选项
为了避免上述情况的发生,可以使用WITH CHECK OPTION选项。使用该选项,可以对视图的插入或更新进行限制,即该数据必须满足视图定义中的子查询中的WHERE条件,否则不允许插入或更新。比如 “清华图书”视图的WHERE条件是出版社编号要等于“01”(01是清华大学出版社的编号),所以如果设置了WITH CHECK OPTION选项,那么只有出版社编号为“01”的图书才能通过清华视图进行插入。
使用WITH CHECK OPTION选项限制视图的插入。
步骤1:重建清华大学出版社的图书视图,带WITH CHECK OPTION选项:
- CREATE OR REPLACE VIEW 清华图书
- AS SELECT * FROM 图书 WHERE 出版社编号= '01'
- WITH CHECK OPTION;
执行结果:
视图已建立。
步骤2:插入新图书:
- INSERT INTO 清华图书 VALUES('A0006','Oracle数据库','02','黄河',3,39.8);
执行结果:
ERROR 位于第 1 行:
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
说明:可见通过设置了WITH CHECK OPTION选项,“02”出版社的图书插入受到了限制。如果修改已有图书的出版社编号情况会如何?答案是将同样受到限制。要是删除视图中已有图书,结果又将怎样呢?答案是可以,因为删除并不违反WHERE条件。
3.来自基表的限制
除了以上的限制,基表本身的限制和约束也必须要考虑。如果生成子查询的语句是一个分组查询,或查询中出现计算列,这时显然不能对表进行插入。另外,主键和 NOT NULL列如果没有出现在视图的子查询中,也不能对视图进行插入。在视图中插入的数据,也必须满足基表的约束条件。
基表本身限制视图的插入。
步骤1:重建图书价格视图:
- CREATE OR REPLACE VIEW 图书价格
- AS SELECT 图书名称,单价 FROM 图书;
执行结果:
视图已建立。
步骤2:插入新图书:
- INSERT INTO 图书价格 VALUES('Oracle数据库',39.8);
执行结果:
ERROR 位于第 1 行:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."图书"."图书编号")
说明:在视图中没有出现的基表的列,在对视图插入时,自动默认为NULL。该视图只有两列可以插入,其他列将默认为空。插入出错的原因是,在视图中不能插入图书编号,而图书编号是图书表的主键,是必须插入的列,不能为空,这就产生了矛盾。
视图的查看
USER_VIEWS字典中包含了视图的定义。
USER_UPDATABLE_COLUMNS字典包含了哪些列可以更新、插入、删除。
USER_OBJECTS字典中包含了用户的对象。
可以通过DESCRIBE命令查看字典的其他列信息。在这里给出一个训练例子。
查看清华图书视图的定义:
- SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='清华图书';
执行结果:
- TEXT
- -----------------------------------------------------------------------------------------------
- SELECT 图书名称,作者,单价 FROM 图书 WHERE 出版社编号='01'
查看用户拥有的视图:
- SELECT object_name FROM user_objects WHERE object_type='VIEW';
执行结果:
- OBJECT_NAME
- ----------------------------------------------------------------------------------------------
- 清华图书
- 图书作者
相关推荐
Oracle 物化视图创建和使用 Oracle 物化视图是一种预先计算并保存表连接或聚集等耗时较多的操作的结果,以提高查询性能。物化视图对应用程序透明,不会影响应用程序的正确性和有效性,但需要占用存储空间。基表发生...
WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不...
可以通过 FORCE 选项创建基表不存在的视图,例如: CREATE FORCE VIEW 视图名 AS SELECT * FROM 表名; 视图的删除: DROP VIEW 视图名; 视图的修改: 可以通过 ALTER VIEW 语句修改视图的定义,例如: ALTER ...
Oracle视图是数据库管理系统中一种非常重要的概念,它提供了从不同角度查看和操作数据的手段。视图是基于一个或多个表或另一个视图的虚拟表,它不存储数据,而是动态生成结果集。视图的主要优点包括安全性、简化查询...
NOFORCE:只有基表存在且具有创建视图权限时,才可以创建视图 WITH CHECK OPTION:指出在视图上所进行的修改都要符合 select_statement 所指定的限制条件 WITH READ ONLY:只允许查看视图 视图的定义原则: 1. ...
Oracle的视图是数据库管理系统中的一个重要概念,它允许用户从一个或多个表中创建虚拟表,这些虚拟表并不存储实际数据,而是根据查询时的定义动态生成结果集。视图在数据库设计中扮演着多种角色,包括数据抽象、权限...
物化视图是Oracle数据库中一种特殊的数据对象,它保存的是基于一个或多个表(称为基表)的查询结果集,并且这些结果集是物理上存在的。与普通的视图不同,普通视图只是一种虚拟表,在执行查询时才动态地计算结果,而...
Oracle 视图详解是指在 Oracle 数据库中创建的虚拟表,以便用户可以更方便地访问和操作数据库中的数据。视图的定义是一个基于查询的结果集,可以来自一个或多个实际表或视图,或者甚至来自其他数据源。Oracle 视图的...
Oracle视图和索引操作知识点总结 Oracle视图是一种虚拟表,从一个或...Oracle 数据库管理与应用实例教程提供了详细的视图和索引操作指南,包括使用 OEM 和 PL/SQL 创建、修改、查看和删除视图和索引的方法和基本步骤。
Oracle物化视图是一种数据库对象,它存储了查询结果,以提供快速的数据访问,特别适合于需要频繁查询但计算过程复杂或涉及大量数据连接的场景。物化视图的使用可以显著提高查询性能,因为它避免了每次查询时的计算...
- `noforce` 是默认选项,如果基表不存在,创建视图的操作将会失败。 - `with read only` 用于创建只读视图,不允许通过视图进行数据的增、删、改操作。 在实际应用中,视图有以下几点重要作用: 1. **安全性**:...
Oracle物化视图是一种在数据库中预先计算并存储视图查询结果的数据对象,它与普通的视图不同,普通视图在查询时动态地基于基表数据生成结果,而物化视图则拥有自己的物理存储,提供了对数据的快速访问。在本篇循序渐...
为了确保视图可以被更新,其定义中不能包含以下语法结构: - 集合操作符 - DISTINCT操作符 - 聚合函数或分析型函数 - GROUP BY、ORDER BY、CONNECT BY或START WITH子句 - 在SELECT列表中使用集合表达式 - 在SELECT...
1. **基表不支持ROWID**:如果基表(即物化视图基于的表)没有定义主键或唯一索引,或者表结构不支持ROWID,则不能创建包含ROWID的物化视图。 2. **列类型限制**:某些列类型不支持ROWID。例如,LOB类型的数据列就...
在Oracle数据库中,同义词(Synonyms)和视图(Views)是两种非常重要的对象,它们都提供了数据访问和管理的便捷方式。下面将详细解释这两种概念以及它们在实际应用中的作用。 **同义词** 同义词是Oracle数据库提供...
在创建视图时,需要注意视图的更新(INSERT, UPDATE, DELETE)可能受到限制,这取决于视图的定义和基表的结构。例如,如果视图包含聚合函数或者GROUP BY子句,通常不允许进行DML操作。 总的来说,Oracle视图是...
第二,ORACLE物化视图的创建过程和管理方法。ORACLE物化视图是指包含一个查询结果的数据库对象,相对于普通视图而言,物化视图是一个物理表。物化视图也是一种段,具有自己的物理存储属性,并占用数据库磁盘空间。...
视图根据其结构和功能分为: - **简单视图**:仅基于单个表,不包含函数、表达式或分组数据。 - **复杂视图**:包含函数、表达式或分组数据。 - **连接视图**:基于多个表的连接。 - **只读视图**:仅支持查询...