对数据库视图view的理解

来源:互联网 时间:1970-01-01

首先解释什么是视图:

视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表,与真实表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间,并且基表的变化会导致视图相应的改变

视图的创建:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

其中:

OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图;

FORCE:不管基表是否存在ORACLE都会自动创建该视图;

NOFORCE:只有基表都存在ORACLE才会创建该视图:

alias:为视图产生的列定义的别名;

subquery:一条完整的SELECT语句,可以在该语句中定义别名;

WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束;

WITH READ ONLY : 该视图上不能进行任何DML操作

在SQL中修改视图中的数据会受到哪些限制?

------------------------------------

1、必须有权限

2、对由多表连接成的视图修改数据时,不能同时影响一个以上的基表,也不能删除视图中的数据

3、对视图上的某些列不能修改,这些列是:计算列,内置函数列和行集合函数列

4、对具有NOT NULL 的列进行修改时可能会出错。通过视图修改或者插入数据时,必须保证未显示的具有NOT NULL 属性的列有值,可以是默认值,IDENTITY 等,否则不能像视图中插入数据行。

5、如果某些列因为规则或者约束的限制不能接受从视图插入的数据时,则插入数据可能会失败

6、删除基表并不删除视图,建议采用与表明显不同的名字命名规则

视图的有点:

1.视图可以隐藏你的查询的复杂性,例如:

SELECT d.dname,count(*) as NUM_EMPS

FROM emp e, dept d

WHERE e.deptno=d.deptno

GROUP BY dname;

不需要输入如此复杂的查询(按照今天的标准来说,那其实并不算是复杂),我可以查询如下的一个视图:

SELECT dname,num_emps FROM my_view; (前提是你创建了基于上面查询的视图)

你也能够将好多相当复杂的查询存储为一个视图,这样就会将查询大大的简化。通过这种方式,视图就是一种宏,它可以在幕后做许多事情,并使得这个过程让终端用户或者应用程序看起来非常简单。

2,视图也可以用于加强安全性。让我们假设一下,我只想要用户BOB看到EMP表中的ENAME 和DEPNO两个列。我可以使用如下所示:

GRANT select ON emp TO bob;

但是上面的命令会使BOB看到表的全部内容。我可以写下如下的一个视图,使BOB只看到自己能够看到的列:

CREATE VIEW bob_emp AS SELECT ename,deptno FROM emp; GRANT select ON bob_emp TO bob;

通过这两条命令,BOBO只能在视图中看到这个表中的两个列。

让我们更进一步的讨论一下安全性的概念。假设我们想要使得每个人都可以查询EMP表,但是只是他们自己的记录。我可以写出如下的视图:

CREATE VIEW my_emp AS SELECT * FROM emp WHERE ename=USER; GRANT select ON my_emp TO public;

当一个用户查询MY_EMP表示,上述视图只会返回那些ENAME列值为他们自己的用户名

Oracle视图非常强大的功能之一在于其可以创 建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成 视图里的该字段名称,那么视图马上就可以成为合法的。
3.Oracle视图非常强大的功能之一在于其可以创 建一个带有错误的视图

比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成 视图里的该字段名称,那么视图马上就可以成为合法的。

视图的缺点:

4.保存复杂查询

一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。

逻辑数据独立性

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

5.视图的依赖性

由于视图的定义是一个引用了其他对象(表,视图)的查询,因此视图依赖于其所引用的对象。Oracle 会自动地处理视图的依赖性。例如,当用户移除了一个视图的基表后再重建此表,Oracle 将检查新的基表是否符合视图的定义并判断视图的有效性。



相关阅读:
Top