oracle 视图
来源:互联网 发布:维护数据库培训班 编辑:程序博客网 时间:2024/06/10 14:56
数据独立性
个人理解为,早期的应用程序所需要的数据是直接跟数据库的表挂钩的,如果说因为某些原因,需要将表结构修改,那么很有可能会导致应用程序也哟啊做相应的修改。这必然会产生很大的麻烦。而如果有视图的话,应用程序直接从视图当中获取数据。这个时候如果需要修改表结构的话,那么无需在修改应用程序。只需要修改一下视图便可。因为应用程序所需要的数据是从视图当中获取的。将应用程序与表分离出来,我认为就是数据独立性。因为这个时候的数据,只是作为数据而已,而没有任何直接的东西依赖于此数据。
视图的优点
- 可以把负责的SQL语句简单化。视图本身其实就是一条SQL语句而已,有可能这个SQL语句非常复杂,但是一旦构成了视图,那么直接使用简单的SQL语句操作视图即可。
- 可以限制数据库的访问。通过视图,用户只能访问视图中的数据项,而无法访问基表中的其他的数据。
- 可以使数据独立于应用程序之外。(这里就可以认为数据的独立性)
- 可以使相同的数据以不同的形式出现在不同的视图当中。例如为每一个不同的用户创建不同的视图,每一个用户看到的数据是相同的,但是列名,视图名或许不同。
创建视图
语法: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的执行步骤如下:
- 从数据字典当中,取出视图的定义,也即是创建视图的那条SQL语句.
- 查看该视图引用得表的权限.
- 将操作视图的语句与视图的定义整合成可执行的一条SQL语句,然后执行.
引用视图的话,会丢失一定的效率问题,从扇面可以看出,执行了2次IO操作,一次是取出视图的定义,一次是访问表中的数据.而IO操作对系统的效率冲击比较大.
使用视图进行DML操作
视图分为2大类,简单视图 以及 复杂视图.
简单视图
数据仅从一个表中提取
不包含函数
不包含分组函数
可以通过该视图进行DML操作
复杂视图
数据从多个表中提取
包含函数
包含分组函数
不一定能够通过该视图进行DML操作
虽然可以通过视图进行DML操作,但是oracle加了许多的限制.在对视图进行DML操作的时候,其实都要转换成对所引用的表的DML操作,会影响到基表.所以对视图进行DML的时候.有如下许多的规则
- 可以再简单视图上执行 DML 操作
- 如果在一个视图中包含了分组函数,或 GROUP BY 字句,或者 DISTINCT 关键字,那么就不能通过该视图进行插入(INSERT), 修改(UPDATE), 删除(DELETE) 操作.
- 如果在一个视图中包含了由表达式组成的列,或伪列 ROWNUM. 那么也不能通过该视图进行插入(INSERT ), 修改(UPDATE) 操作.
- 如果在一个试图中没有包含引用表中那些不能为空(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 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 行查询分析. 暂时没去学习.
视图应该掌握的内容为:
- 什么是视图
- 引入视图的原因
- 什么是数据的独立性
- 怎么利用视图维护数据的独立性
- 视图有什么好处,坏处
- 如何创建,修改,删除视图
- 从数据字典当中查看视图
- 使用 WITH CHECK OPTION 以及 WITH READ ONLY
- 内嵌式视图
阅读全文
0 0
- oracle视图
- oracle视图
- Oracle视图
- Oracle视图
- Oracle视图
- Oracle视图
- oracle视图
- Oracle 视图
- oracle 视图
- oracle视图
- oracle视图
- oracle 视图
- oracle 视图
- Oracle视图
- Oracle视图
- oracle 视图
- oracle视图
- oracle 视图
- 最全面的Java多线程用法解析
- 稀疏自编码
- UVa213-Message Decoding
- Foxit MobilePDF SDK_如何快速创建一个功能丰富的PDF 阅读器
- C#详解值类型和引用类型区别
- oracle 视图
- 搭建Lua开发环境
- 技术文章 | JavaScript与PHP到底有何不同?
- 怎么在游戏里制作出一张合格的720全景
- 关于安卓保存网络图片并更新图库
- USACO Section 1.5 Prime Palindromes
- Android -- AsyncTask源码解析
- UVA
- PHP基础字符串