Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97201
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2017-02-07 17:04
个人简介

不积跬步无以至千里,每天进步一点点~

文章分类

全部博文(35)

文章存档

2018年(3)

2017年(32)

我的朋友

分类: Oracle

2017-12-11 15:07:59

视图是从一个或者几个实体表导出的表。它与是体表不同,视图本身是一个不包含任何真实数据
的虚拟表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的表
中。所以实体表中的数据变化,从视图中查询的数据也就随之改变。从这个意义上讲,视图就像
一个窗口,通过他可以看到数据库中自己感兴趣的数据及其变化。
视图的优点:
视图能够简化用户的操作
视图是用户能以多种角度看待同一数据
视图对重构数据库提供了一定程度的逻辑独立性
视图能够对机密数据提供安全保护
适当的利用视图可以更清晰的表达查询
1.创建视图
创建视图语法:
CREATE[FORCE][NOFORCE][OR REPLACE]VIEW 视图名称[别名]AS 子查询;
语法参数:
  FORCE:表示要创建的视图表不存在也可以创建视图
  NOFORCE:表示要创建的表必须存在,否则无法创建(默认)
  OR REPLACE:表示视图的替换,如果创建的视图不存在则创建新的,如果视图已经存在,
  则将其进行替换。
  范例:创建一张基本工资大于2000的雇员视图
  grant create view to c##scott;--赋权
  CREATE VIEW v_myview AS
    SELECT *FROM emp WHERE sal>2000;
    select * from v_myview;
  oracle之中,针对于视图也提供了一个数据字典:user_views  
    select * from user_views;
  范例:创建一张只包含20部门的部门信息
  create view v_dept20 as 
  select * from dept where deptno=20;
  select * from v_dept20;
  替换视图:
  create or replace view v_myview as
  select * from emp;
  select * from v_myview;
  2.在视图上执行DML操作
  对于DML查询视图是一定可以完成的,可是对于更新操作能否完成,就需要进行试验,不过从实际
  的开发角度来讲,不建议在视图上更新。
  1.更新简单视图(单表映射数据)
  创建只包含20部门的雇员信息
  create or replace view v_emp20
  as select *from emp where deptno=20;
  select * from v_emp20;
  在进行视图增加数据的时候,如果视图只包含了表中的部分数据,那么增加时也会增加部分数据,
  没有映射到视图之中的列,那么都会使用null填充。
  2.对视图进行更新
  update v_emp20 set sal= 1000 where empno='7369' 
  3.对视图进行删除
  delete from v_emp20 where empno='7369'
通过以上的几个程序可以发现,简单视图更新的时候会直接影像到实体数据。
  4.更新复杂视图(多表映射)
  create or replace view v_myview as
  select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname,d.loc
  from emp e,dept d
  where e.deptno=d.deptno and d.deptno= 20;
  select * from v_myview;
  范例:向v_myview 中增加数据
  insert into v_myview(empno,ename,job,sal,deptno,dname,loc)
  values(6688,'wing','clerk',3000,50,'试验','北京');
  SQL 错误: ORA-01776: 无法通过联接视图修改多个基表
  所以建议:视图不要进行更新操作,只进行查询操作
  
  3.with check option 子句
  在创建视图的时候有时候需要使用一些where 子句做一些条件的限制,但是默认情况下的视图
  创建完成之后,是可以通过视图去修改where子句之中所使用的字段内容的,而在此时就需要
  通过 with check option 子句来保证视图的创建条件不被更新。
  语法:
  CREATE[FORCE][NOFORCE][OR REPLACE]VIEW 视图名称[别名]
  AS
  子查询[with check option[constraint约束名称]];
范例:
 create or replace view v_emp20
  as 
 select *from emp where deptno=20
with check option constraint v_emp20_ck;
4.with read only 子句
让视图中所有字段不可更新,则可以通过with read only 子句控制。
语法:
  CREATE[FORCE][NOFORCE][OR REPLACE]VIEW 视图名称[别名]
  AS
  子查询[with check option[constraint约束名称]]
  [with read only];
  范例:
  create or replace view v_myview
  as
  select * from emp where deptno=20
  with read only;
  update v_myview set ename='dgq' where empno=7369;
  SQL 错误: ORA-42399: 无法对只读视图执行 DML 操作
  5.删除视图
  drop view 语法
  drop view 视图名称;
  select * from user_views;
  drop view my_view;
  drop view v_dept20;
  drop view v_emp20;
  drop view v_myview;
  
  视图=复杂的查询语句
  
  
阅读(1677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~