Oracle数据库对象_视图

视图是一种非常重要的数据库对象,它的形式类似于普通表,我们可以从视图中查询数据。

实际上它是建立在表上的一种虚表,在视图中并不存储真正的数据,而是仅仅保存一条SELECT语句,对视图的访问将被转化为对表的访问。

视图所基于的表称为基表,而视图可以认为是对基表的一种查询操作。

使用视图的主要目的是为了方便用户访问基表,以及保证用户对基表的安全访问。

对用户而言,往往要对一个表进行大量的查询操作,如果查询操作比较复杂,并且需要频繁地进行,那么可以为这个查询定义一个视图。

需要注意的是,在视图中并不保存对基表的查询结果,而仅仅保存一条SELECT语句。

只有当访问视图时,数据库服务器才去执行视图中的SELECT语句,从基表中查询数据。

虽然我们对视图没有做过任何修改,但是对视图的多次访问可能得到不同的结果,因为基表中的数据可能随时被修改。

所以视图中并不存储静态的数据,而是从基表中动态查询的。

从另外一个角度来看,视图可以保证对基表的安全访问。

在设计表时,我们一般是从整体的角度来考虑表的结构的,而不是从每个用户的角度来确定表结构以及定义允许的操作。

对于同一个表,不同的用户可以进行不同的操作,可以访问不同的数据。

这样我们就可以为不同的用户定义不同的视图,从而保证用户只能进行允许的操作,访问特定的数据。

视图的创建、修改和删除

用户可以在自己的模式中创建视图,只要具有CREATE VIEW这个系统权限即可。

如果希望在其他用户的模式中创建视图, 则需要具有CREATE ANY VIEW 系统权限。

如果一个视图的基表是其他用户模式中的对象,那么当前用户需要具有对这个基表的SELECT权限。

创建视图的命令是CREATE VIEW ,这条命令的格式为:

CREATE OR REPLACE 视图名称

AS SELECT 语句

WITH READ ONLY

WITH CHECK OPTION;

其中最后两个选项是可选的,其中“WITH READ ONLY”限定对视图只能进行查询操作,不能进行DML操作。
“ WITH CHECK OPTION”限定DML操作必须满足一定的条件。

视图被创建之后,可以通过DESC 命令查看视图的结构。

查看视图结构的方法与查看表的方法相同,查看的结果是列出视图中各列的定义。

视图的结构是在执行CREATE VIEW语句创建视图时确定的,在默认情况下,列的名称与SELECT之后基表的列名相同,数据类型和是否为空也继承了基表中的相应列。

如果希望视图中的各列使用不同的名字,那么在创建视图时,在视图的名称之后应该指定各列的名称。

视图作为一种数据库对象,它的相关信息被存储在数据字典中。

与当前用户的视图有关的数据字典是USER_VIEWS ,查询这个数据字典,可以获得当前用户的视图的相关信息。

数据字典视图USER_VIEWS 各列的定义及其意义如下:

名称             意义

VIEW_NAME       Name of the view
TEXT_LENGTH      Length of the view text
TEXT                   View text
TYPE_TEXT_LENGTH     Length of the type clause of the object view
TYPE_TEXT           Type clause of the object view
OID_TEXT_LENGTH     Length of the WITH OBJECT OID clause of the object view
OID_TEXT           WITH OBJECT OID clause of the object view
VIEW_TYPE_OWNER     Owner of the type of the view if the view is a object view
VIEW_TYPE          Type of the view if the view is a object view
SUPERVIEW_NAME      Name of the superview, if view is a subview
EDITIONING_VIEW     An indicator of whether the view is an Editioning View
READ_ONLY          An indicator of whether the view is a Read Only View

注:indicator 指示符。

在列TEXT 中存储的是创建视图时使用的SELECT语句。

另外,在数据字典ALL_ VIEWS 存储的是当前用户可以访问的所有视图的信息,在数据字典DBA_VIEWS存储的是系统中的所有视图的信息,这个数据字典只有DBA可以访问。

如果发现视图的定义不合适,可以对其进行修改。

实际上视图中的SELECT语句是不能直接修改的,所以修改视图的一种方陆是先删除视图,再重新创建,另一种方怯是在创建视图的CREATE语句中使用OR REPLACE选项。

视图在不需要时,可以将其从数据库中删除。

删除视图的命令是DROP VIEW

用户可以直接删除自己创建的视图,如果希望删除其他用户创建的视图,则需要具有DROP ANY VIEW这个系统权限。

DROP VIEW命令的格式为:

DROP VIEW 视图名称;

视图被删除后,相关的信息也被从数据字典中删除。

如何对视图进行访问

对视图的访问包括查询受限制的DML操作

访问视图的方法与访问表的方法基本相同。

在访问视图时,这种访问被转化为对基表的访问,所以在视图上执行DML操作时,也要遵守基表上的约束。

复杂视图

以前在创建视图时,在CREATE VIEW语句的SELECT子句中只涉及一个表的操作,并且只是对基表中的列进行简单的查询,并没有出现多个基表,或者对基表中的列进行表达式运算或者函数运算的情况,这种视图被称为简单视图

对简单视图不仅可以进行查询操作,还可以进行DML操作。

复杂视图是这样的视图,视图中的列是从基表中的列经过表达式或函数运算而来,或者是对基表进行了DISTINCT查询,或者、涉及多个表的操作。

总而言之,如果在用CREATE VIEW语句创建视图时,在SELECT之后的列名中使用了表达式、函数,或者使用了DISTINCT关键字,或者对多个表进行了连接查询,这样的视图都是复杂视图。

创建复杂视图仍然是通过执行CREATE VIEW命令完成的,只不过因为在SELECT子句中使用了表达式或者函数,这样的运算式不能作为视图中的列名,所以在创建复杂视图时必须为每个列指定列名。

对复杂视图,允许的操作只有查询,大部分视图不允许DML操作。

现在我们总结一下在什么样的视图上可以执行DML操作,在什么样的视图不允许执行DML操作。

对于简单视图,如果基表中的所有列都被包含在视图中,或者至少主键列和所有不允许为空的列都被包含在视图中,并且在创建视图的CREATE VIEW语句的SELECT语句中最多只使用了WHERE子句,对这样的视图是可以进行插入、删除、修改操作的。

如果在创建这样的简单视图时使用了WITH CHECK OPTION选项,那么执行DML操作时要遵守一定的约束条件。

对于涉及多个基表的复杂视图,如果其中至少一个表的所有列都被包含在视图中,或者至少一个表的主键列和所有不允许为空的列都被包含在视图中,并且在创建视图的CREATEVIEW语句的SELECT语句中最多只使用了WHERE子句,这样的视图是允许进行插入、删除、修改操作的。

对这样的视图进行DML操作时,只有其中一个表可以被修改,并且被修改的列只能映射到一个表中。

对于只涉及一个基表的复杂视图,如果视图中的列是对基表的列经过某种运算而来,包括表达式AVG 等函数,或者在创建视图的CREATE VIEW 语句的SELECT语句中使用了DISTINCT关键字GROUP子句,对这样的视图是不能进行DML操作的。

对于涉及多个表的视图,如果视图中的列没有包含其中一个表中的所有主键列和所有不为空的列,或者视图中的部分列是经过对基表中的列经过某种运算而来的,或者在创建视图时在SELECT子句中使用了DISTINCT关键字、GROUP子句,这样的视图也是不能进行DML操作的。

时间: 2024-10-12 14:24:58

Oracle数据库对象_视图的相关文章

Oracle数据库对象_同义词

同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写. 同义词的概念和类型 利用同义词可以为用户的一个对象,或者其他用户的一个对象定义别名,从而简化命令或程序的书写,在命令或程序中可以直接使用同义词代替原来的对象. 可以为表.视图.存储程序.序列等对象建立同义词,也可以为一个同义词再建立同义词,甚至可以为一个不存在的对象建立同义词,系统仅仅在使用同义词时才验证它所代表的对象是否存在.同义词本身并不包含原对象中的数据或代码,它的作用仅仅相当于一个指

Oracle数据库对象_索引

查询是在表上进行的最频繁的访问. 在查询数据时,很少有用户愿意查询表中的所有数据,除非要对整个表进行处理.一般情况下用户总是查询表中的一部分数据. 在SELECT语句中,通常需要通过WHERE子句指定查询条件,以获得满足该条件的所有数据.如果能够在很小的范围内查询需要的数据,而不是在全表范围内查询,那么将减少很多不必要的磁盘1/0 ,查询的速度无疑会大大加快.提供这种快速查询的方法就是索引. 索引的基本概念 索引是一种建立在表上的数据库对象,它主要用于加快对表的查询操作. 合理使用索引可以大大减

Oracle数据库对象_序列

序列是一种数据库对象,用来自动产生一组唯一的序号. 序列是一种共享式的对象,多个用户可以共同使用序列中的序号.一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键列的值不会重复.用这种方式可以代替在应用程序中产生主键值的方法,可以获得更可靠的主键值.注:在序列指定最大值和可循环属性后,序列中的序号是可以循环使用的. 序列的创建.修改和删除 默认情况下,用户可以在自己的模式中创建序列.如果希望在其他用户的模式中创建序列,则必须具有CREATE ANY SEQ

Oracle数据库对象_约束

约束是加在表上的一种强制性的规则,是保证数据完整性的一种重要手段. 当向表中插入数据,或修改表中的数据时,必须满足约束所规定的条件. 在设计表的结构时,应该充分考虑在表上需要施加的约束.保证数据完整性的方法大致有三种,即应用程序代码.触发器和约束. 其中约束是一种更为灵活的方式,它不仅维护更加方便,而且性能也比较高,是保证数据完整性的最佳选择.约束可以在创建表时指定,也可以在表创建之后再指定. 如果在表创建之后再指定约束,可能会因为表中已经存在一些数据不满足这个条件而使得约束无法施加. 约束的类

Oracle数据库对象(视图、序列、索引、同义词)

1.视图 视图是一张虚表(是表但是没有数据,数据来自于视图所依赖的表) (1)先为用户授权: 管理员登录: 管理员授权给用户SCOTT: (2)视图的创建: (3)优点:简化查询,有的时候只需查询视图即可,不需要再写复杂的查询语句来查询数据. (4)删除视图: drop view 视图名称: 只是删除视图,不会删除表中的数据. 2.序列 序列的功能和auto_increment的功能相同,主要用于提供主键的值,序列输一个数组,存储在内存中,可以提高访问效率. (1)序列的定义: CREATE S

Oracle数据库对象,同义词、序列、视图、索引

数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提供对对象的公共访问 同义词共有两种类型: CREATE USER test IDENTIFIED BY test; GRANT CONNECT , CREATE SYNONYM TO test; GRANT SELECT ON SCOTT.EMP TO test; GRANT DELETE ON S

Oracle数据库对象

Oracle数据库对象又称模式对象,它是逻辑结构的集合,其中最基本的数据库对象是表.常见的数据库对象包括同义词.序列.视图等. 1.视图 视图可以限制表中一组行为访问.隐藏了数据的复杂性.简化了用户的sql.基表定义修改隔离.通过重命名列从另一个角度提供了数据. 2.触发器(Trigger) 如果想对视图进行增删改,就可以使用触发器. 3.数据字典 oracle中分为了静态数据字典和动态数据字典. 静态数据字典: dba_*** :查看所有的用户表 all_*** :查看该用户下能看到的所有表

Oracle数据库对象查询是否被锁定及解锁

Oracle数据库对象是否被锁定查询SQL及解锁过程SQL详见下面: --查询当前用户下被锁的对象SELECT B.OBJECT_NAME, B.OWNER, C.SID,C.SERIAL#,C.OSUSER, C.MACHINE, C.TERMINAL  FROM V$LOCKED_OBJECT A, DBA_OBJECTS B, V$SESSION C WHERE A.OBJECT_ID = B.OBJECT_ID   AND A.SESSION_ID = C.SID   AND c.STA

数据库对象(视图,序列,索引,同义词)【weber出品必属精品】

视图视图的定义:视图就是一个查询的别名为什么使用视图限制数据的存取 SQL> conn /as sysdba 已连接. SQL> grant create view to scott; 授权成功. SQL> create view v1 as select empno,ename,job,mgr from emp; 视图已创建. SQL> select * from v1; EMPNO ENAME JOB MGR ----- ------ --------- ----- 7369