备注:首先要说明的是,普通视图和物化视图之间根本没有可比性,完全是不同性质的东西,但是名称相似,所以就放在一起介绍。
1 普通视图
普通视图仅仅就是一系列复杂SQL语句的封装。
其不存储任何数据的,只有定义,对视图的操作最终会转化为对表SQL语句的操作。
三个特征:
1、简化设计,目的是清晰编码,并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在主要是为了在设计上的方便性
2、安全,在授权给其他用户或者查看角度,多个表关联只允许查看,不允许修改,单表也可以同WITH READ ONLY来控制,当然有些项目基于视图做面向对象的开发,即在视图上去做INSTAND OF触发器,就我个人而言是不站同的,虽然开发上方便,但是未必是好事。
3、从不同的角度看不同的维度,视图可以划分维度和权限,并使多个维度的综合,也就是你要什么就可以从不同的角度看,而表是一个实体的而已,一般维度较少(如:人员表和身份表关联,从人员表可以查看人员的维度统计,从身份看,可以看不同种类的身份有那些人或者多少人),其次另一个如系统视图USER_TABLE、TAB、USER_OBJECTS这些视图,不同的用户下看到的肯定是不一样的,看的是自己的东西。
最简单的视图创建:
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
====================== 转自网络 ======================
查询的别名
select t.ename from (select rownum,emp.* from emp) t ——内嵌视图
内嵌视图是不能存储在数据库中。
普通视图是可以存储在数据库中的,而且,再次查询视图,不需要重新编译
查询语句。因为,普通视图在数据库中存储视图的定义和视图的编译结果。
——普通视图本身不存数据,只存储查询,当查询视图时,会再次执行查询
——不占用数据库的空间(数据段)
Create or replace view View_name(alias1,…,aliasn)
As
Select_statement
[with check option [constraint c_name]]
[with read only]
——or replace:用于修改视图,或者在创建视图时,如果存在同名视图,则覆盖其定义
——with check option:用于定义视图的chech约束
——with read only:定义视图不可更新(只读,只能select)
create or replace view a
as
select * from emp where deptno=20
with check option
——此视图只能操作deptno=20的数据
insert into a(empno,ename,deptno)
values(1234,'aaa',10);——非法的
create or replace view a
as
select * from emp where deptno=20
with read only
——此视图只能select
2 物化视图:
物化视图是一种特殊的物理表,其将数据转换为表,实际存储着数据,这样查询数据就不用执行非常耗时的可能连接多张表的复杂SQL语句了。
物化视图目的是为了提高性能。