视图的应用场合
1.简化用户对数据的理解,隐藏表结构的复杂性。经常使用的查询定义为视图,不用每次操作指定全部的条件
2.限制对一组预定义的表行的或列的访问,提供更好的安全级别
3.隔离应用程序对基表定义的更改,并不会影响到视图
视图分为简单视图和复杂视图:
1、简单视图只从单表里获取数据,复杂视图从多表;
2、简单视图不包含函数和数据组,复杂视图包含;
3、简单视图可以实现DML操作,复杂视图部分可以。
复杂视图DML限制条件
1〉不允许违反约束的 DML 操作。2〉不能将一个值添加到包含算术表达式的列中,列不能是虚拟列
3〉在非 key-preserved 表上不允许 DML 操作。(key-preserve table)键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表。
4〉在包含组函数、GROUP BY 子句、ROWNUM伪列或DISTINCT关键字的视图上不允许 DML 操作。
1 --赋予用户创建视图的权限 2 grant create view to scott; 3 --创建复杂视图 4 create or replace view v_emp_sum (deptno,emp_count,max_sal,min_sal,sum_sal) 5 as select dept.dname,count(emp.empno),max(emp.sal),min(emp.sal),sum(emp.sal) 6 from emp,dept where emp.deptno =dept.deptno group by dept.dname; 7 select * from v_emp_sum; 8 --可进行DML(insert,update,delete)操作的视图 9 create or replace view v_empdept_update 10 as 11 select emp.empno,emp.ename,emp.job,dept.dname,dept.loc from dept,emp 12 where dept.deptno=emp.deptno; 13 14 update v_empdept_update set ename='张三丰' where empno=7499; 15 select * from v_empdept_update; 16 17 简单视图是可以进行DML操作。复杂视图有部分可以DML操作,若复杂视图中有分组函数、groupby字句、distinct、伪列等则不可以做DML操作。 18 --数据视图字典查看哪些列时可以更新的 19 select table_name,column_name,updatable, insertable,deletable from user_updatable_columns 20 where table_name='V_EMPDEPT_UPDATE'; 21 /*内嵌视图查询,内嵌视图是子查询中的一种,可以与数据表,视图一样作为数据源的存在 22 但是它只会使用一次,不会创建具体的方案对象, 不具备复用性*/ 23 select d.deptno,d.dname,emp_cnt.tot from dept d,(select deptno,count(*) tot from emp group by deptno) emp_cnt where d.deptno=emp_cnt.deptno; 24 --对象视图 25 create or replace type typ_emp as object( 26 empno number, 27 empname varchar2(20), 28 job varchar2(20) 29 ) 30 --让scott表中的数据使用面向对象的方式编程,创建一个基于emp表的对象视图 31 create or replace view ov_emp of typ_emp with object oid(empno) 32 as select empno a_id,ename,job from emp; 33 ---对象类型的使用实例 34 Declare 35 o_emp typ_emp; 36 begin 37 select value(t) --从对象视图中获得对象实例 38 into o_emp 39 from ov_emp t 40 where empno=7369; 41 o_emp.empname:='张三丰'; 42 o_emp.job:='武当掌门'; 43 o_emp.empno:=7999; 44 insert into ov_emp values(o_emp); --向对象视图中插入一个新的对象实例 45 end; 46 select * from emp; 47 48 --修改视图的定义信息 49 create or replace view emp_view_union as 50 select d.dname,d.loc,e.empno,e.ename 51 from emp e,dept d 52 where e.deptno = d.deptno and d.deptno =30; 53 select * from emp_view_union; 54 --重新编译视图,当用户访问视图时,Oracle会自动重新编译视图 55 --除此之外,也可以用alter view语句手动编译视图 56 alter view emp_view_union compile; 57 --删除视图 58 drop view emp_view_union; 59 --内联视图 emp_cnt 60 select d.deptno,d.dname,emp_cnt.tot from dept d,(select deptno, count(*) tot 61 from emp group by deptno) emp_cnt where d.deptno =emp_cnt.deptno; 62 --创建薪资等级内联视图 63 select dept.deptno,dept.dname,NVL(MAX(emp_grade.grade),0) from dept, 64 (select emp.ename,emp.job,emp.deptno,(select grade from SALGRADE where emp.sal between 65 salgrade.losal and salgrade.hisal) grade from emp ) emp_grade --创建一个内联视图 66 where dept.deptno =emp_grade.deptno(+) --使用左链接显示所有部门 67 group by dept.deptno,dept.dname 68 order by nvl(max(emp_grade.grade),0) desc; 69 70 71 --指定在视图中只有可访问的行才能被插入或修改 72 create or replace view v_deptemp_check 73 as select empno,ename,job,comm,deptno 74 from emp where deptno=20 75 with check option constraint v_empdept_chk; 76 --如果操作的数据不在select查询所能选择的数据范围将报错 77 insert into v_deptemp_check values(7999,'李思','经理',7369,sysdate, 78 800,null,30); 79 80 --只读视图 DQL-SELECT 81 create or replace view emp_view_readonly as 82 select * from dept where deptno !=88 83 with read only 84 update emp_view_readonly set loc='沈阳'; 85 create or replace view emp_view_complex as 86 select deptno 部门编号,max(sal) 最高工资,min(sal) 最低工资,avg(sal) 平均工资 87 from emp group by deptno; 88 select * from emp_view_complex; 89 90 --重新编译视图,当用户访问视图时,Oracle会自动重新编译视图 91 --除此之外,也可以用alter view语句手动编译视图 92 alter view emp_view_union compile; 93 当用户需要临时性地聚合一些数据集,构造这些数据集的查询语句,不需要重复使用时,可以考虑内联视图 94 如果数据结果需要重复使用,考虑建立临时表并且添加索引来争强查询性能;
1 创建语句:create materialized view mv_name as select * from table_name 默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。 2 物化视图 3 对于标准视图来说,用户每次引用视图都必须重新执行视图的解析过程 4 如果定义的视图非常复杂,非常消耗时间,对于频繁访问视图效率非常低 5 物化视图用来解决这种复杂视图的性能问题 6 1. 实现两个数据库之间的数据同步,可以存在时间差。 7 2. 如果是远程链接数据库的场景时,提高查询速度。 8 不能改变物化表的列和数据,只能改基表; 9 10 --刷新指基表的数据发生变化时,如何更新物化视图中的数据 11 --必须先建立物化视图表 ,用于记录基表数据更改的模式对象,指定在物化视图日志中记录更改主键 12 create materialized view log on emp with primary key 13 including new values; 14 --赋予权限 15 grant create materialized view to scott; 16 --默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。 17 create materialized view ma_emp_count as 18 select deptno,count(*) deptnum from emp group by deptno; 19 exec dbms_mview.refresh('MA_EMP_COUNT'); 20 21 --refresh fast 指定刷新方式 22 create materialized view emp_data refresh fast as select * from emp; 23 insert into emp values(8099,'张大白','分析员',7369,sysdate,2000,100,20); 24 --查看日志表 25 select * from MLOG$_emp; 26 select * from emp_data; 27 --视图使用的是on demand的更新模式,需要手动刷新物化视图 28 --在空闲的时候手动更改,避开高峰期 29 exec dbms_mview.refresh('EMP_DATA','F'); 30 31 --修改物化视图 32 alter materialized view emp_data 33 on demand 34 refresh with primary key --更改物化视图的结构为主键物化视图 35 start with trunc(sysdate+1)+9/24 --开始时间是明天9点 36 next sysdate+2 37 enable query rewrite; --启用物化视图的查询重写项 38 39 --删除实体化视图 40 drop materialized view emp_data; 41 --删除实体化视图日志 42 drop materialized view log on emp; 43 44 一.refresh[FAST] complete[force]选项指定视图刷新的方式 45 1.Fast 增量刷新: 假设第一次刷新时间为T1,Fast模式刷新时,只添加T1到当前时间段 46 基表变化的数据,需要物化视图日志表 47 48 2. complete 全部刷新,相当于重新执行一次创建视图的查询语句 49 3 .Force: 默认模式,当可以使用Fast模式时采用Fast,否则complete 50 51 二 on[commit][demand]指定数据刷新的时间 52 on demand 用户需要的时候,手动刷新 默认 53 on commit 当有数据提交的时候立即刷新 54 三 物化视图的创建方式 55 BUILD immediate,在创建视图的时候就生成数据(默认) 56 build deferred 创建不生成,根据需要来生成 57 58 四 启用或禁用查询重写 59 enable query rewrite 将对基表的查询转化为物化视图查询,提高查询性能 60 disable query rewrite 禁用查询重写. 61 五 62 start with 指定的时间开始, 63 next ,刷新间隔