oracle 视图

来源:互联网 发布:维护数据库培训班 编辑:程序博客网 时间:2024/06/10 14:56

数据独立性

个人理解为,早期的应用程序所需要的数据是直接跟数据库的表挂钩的,如果说因为某些原因,需要将表结构修改,那么很有可能会导致应用程序也哟啊做相应的修改。这必然会产生很大的麻烦。而如果有视图的话,应用程序直接从视图当中获取数据。这个时候如果需要修改表结构的话,那么无需在修改应用程序。只需要修改一下视图便可。因为应用程序所需要的数据是从视图当中获取的。将应用程序与表分离出来,我认为就是数据独立性。因为这个时候的数据,只是作为数据而已,而没有任何直接的东西依赖于此数据。

视图的优点


  1. 可以把负责的SQL语句简单化。视图本身其实就是一条SQL语句而已,有可能这个SQL语句非常复杂,但是一旦构成了视图,那么直接使用简单的SQL语句操作视图即可。
  2. 可以限制数据库的访问。通过视图,用户只能访问视图中的数据项,而无法访问基表中的其他的数据。
  3. 可以使数据独立于应用程序之外。(这里就可以认为数据的独立性)
  4. 可以使相同的数据以不同的形式出现在不同的视图当中。例如为每一个不同的用户创建不同的视图,每一个用户看到的数据是相同的,但是列名,视图名或许不同。

创建视图


语法:CRETE [OR REPLACE] [FORCE | NOFORCE] VIEW 视图名 [(别名[,别名])...] AS 子查询语句 [WITH CHECK OPTION [CONSTRAINT 约束名]] [WITH READ ONLY]
各选项的含义如下:
OR REPLACE如果创建的视图已经存在,oracle会重建这个视图.也即是覆盖. 在实际应用中,应当确认视图是否存在,是否依然在使用当中.
FORCE  不管所引用的表是否存在,oracle都会创建这个视图.
NOFORCE 只有当引用的表都存在的时候,oracle才会创建这个视图(Oracle的默认方式)
视图名 要创建的视图的名字
别名 即将要创建的视图的列名.列名的个数一定要与子查询产生的额列数相等.
子查询 一个完整的查询语句.
WITH CHECK OPTION所插入或修改的数据行必须满足该约束条件.也就是说,子查询,或者为视图插入的数据必须要满足这个约束条件.与表约束是一样的.
约束名 WITH CHECK OPTION 的名称
WITH READ ONLY保证该视图为只读.也即是除了读之外,不能在该视图上进行插入操作等 DML 操作.
在这种子查询语句中,不能包含 ORDER BY 字句,这是因为视图给出的数据并不是最终的数据.. 然而我们可以在视图上进行 ORDER BY 排序.

例如: 中文需要用""双引号括起来

create or replace view acct  ("名字","工资","职位","雇佣日期","部门","地点")  as  select ename, sal, job, hiredate, dname, loc  from emp, dept  where emp.deptno = dept.deptno  and emp.deptno = 10;


建好视图之后,可以利用 desc 命令来查看一下创建的视图
desc acct

关于在视图中取别名是因为,视图一般都是针对非专业 IT 人员,他们需要一个更直观的展示.

修改视图


oracle并没有直接修改视图的方法,如果你想修改一个已经存在的视图,那么只能利用新的SQL语句,重新覆盖已经存在的,相当于重新建一个视图.
例如想要修改上面的视图,以便查看更多的数据,那么可以覆盖


视图建好之后,最好查看一下是否是想要的数据结构.

管理视图


视图一旦建立,就会储存在oracle提供的书字典当中.通过 user_views 可以查询到视图信息.



想查询到更多的信息, 可以使用 SELECT * FROM user_views

利用视图查询的时候oracle的执行步骤如下:


  1. 从数据字典当中,取出视图的定义,也即是创建视图的那条SQL语句.
  2. 查看该视图引用得表的权限.
  3. 将操作视图的语句与视图的定义整合成可执行的一条SQL语句,然后执行.
引用视图的话,会丢失一定的效率问题,从扇面可以看出,执行了2次IO操作,一次是取出视图的定义,一次是访问表中的数据.而IO操作对系统的效率冲击比较大.

使用视图进行DML操作


视图分为2大类,简单视图 以及 复杂视图.

简单视图

数据仅从一个表中提取
不包含函数
不包含分组函数
可以通过该视图进行DML操作

复杂视图

数据从多个表中提取
包含函数
包含分组函数
不一定能够通过该视图进行DML操作

虽然可以通过视图进行DML操作,但是oracle加了许多的限制.在对视图进行DML操作的时候,其实都要转换成对所引用的表的DML操作,会影响到基表.所以对视图进行DML的时候.有如下许多的规则

  1. 可以再简单视图上执行 DML 操作
  2. 如果在一个视图中包含了分组函数,或 GROUP BY 字句,或者 DISTINCT 关键字,那么就不能通过该视图进行插入(INSERT), 修改(UPDATE), 删除(DELETE) 操作.
  3. 如果在一个视图中包含了由表达式组成的列,或伪列 ROWNUM. 那么也不能通过该视图进行插入(INSERT ), 修改(UPDATE)  操作.
  4. 如果在一个试图中没有包含引用表中那些不能为空(NOT NULL) 的列,就也不能通过该视图进行插入(INSERT) 操作.

使用视图的 WITH CHECK OPTION 字句


如下:
create view sales30asselect * from empwhere deptno = 30with check option constraint sales30_ck;


该视图所引用的约束,使用了 where 字句的条件,也就是 where deptno = 30 ,视图建立之后如果要插入 或者修改视图中的数据, 都会受到 该约束条件的检查,查看是否满足 deptno = 30.如果是则成功,否则失败.

查看视图结构

desc sales30;
查看视图数据

select * from sales30;


加入在尝试修改该视图当中的数据,如:

update sales30 set deptno = 10 where job = 'MANAGER';


此时就会出现异常,


oracle提示 视图违反约束 WHERE 字句违规.说明在建立视图的时候,使用了 WHERE 条件中的字句来当成约束.
所以 WITH CHECK OPTION CONSTRAINT 字句到的含义是:所有通过该视图进行的 DML 操作 都不能违反了在创建视图时用 where 自己所限定的条件.


视图的 WITH READ ONLY


使用该字句的视图,就是只读的.不允许修改.

如下.创建视图,

create or replace view acct("名字","工资","职位","雇佣日期","部门","地点")asselect ename, sal, job, hiredate, dname, locfrom emp, deptwhere emp.deptno = dept.deptnoand emp.deptno = 10with read only;


查看视图中的 数据


修改视图中的数据

update acct set "工资" = 9999;


修改的时候 oracle出现异常,提示无法对只读视图进行 DML 操作.同样会拒绝执行 DELETE 操作. 只读视图只能读取数据,


在创建视图的时候,应该尽量使用 WITH READ ONLY 字句,这样可以避免许多因为 DML 误操作对真正的表的破坏.

删除视图


语法: DROP VIEW 视图名


内嵌式视图



如上所示,FROM 字句当中的子查询语句就是一个内嵌式视图. 上面是把子查询语句放在 FROM 子句当中,并为该子查询语句定义一个别名来定义一个内嵌式视图.
内嵌式视图不属于任何用户,也不是对象


还有一个是前 N 行查询分析. 暂时没去学习.


视图应该掌握的内容为:

  1. 什么是视图
  2. 引入视图的原因
  3. 什么是数据的独立性
  4. 怎么利用视图维护数据的独立性
  5. 视图有什么好处,坏处
  6. 如何创建,修改,删除视图
  7. 从数据字典当中查看视图
  8. 使用 WITH CHECK OPTION 以及 WITH READ ONLY
  9. 内嵌式视图

原创粉丝点击