一、概述
视图(View)是从一个或多个表(其他视图)中导出的表,其结构和数据是建立在对表的查询基础之上的。所以视图不是真实存在的基础表,而是一张虚表。视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表一样在数据库中另外存储一份,通过视图看到的数据只是存放在基表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)和删除。
当对视图中的数据进行修改时,相应的基表的数据也要发生变化,同时,如果基表的数据发生变化,则这种变化也可以自动地反映到视图中。
二、视图的特点
1.视点集中,减少对象大小
视图让用户能够着重于他们所需要的特定数据或所负责的特定要求,如用户可以选择特定行或特定列。
2.从异构源组织数据
可以在连接两个或多个表的复杂查询的基础上创建视图,这样可以将单个表显示给用户。
3.隐藏数据的复杂性,简化操作
视图向用户隐藏了数据库设计的复杂性,这样如果开发者改变数据库设计,不会影响到用户与数据库交互。另外,用户可将经常使用的连接查询、嵌套查询或联合查询定义为视图。
4.简化用户权限的管理
可以将视图的权限授予用户,而不必将基表中某些列的权限授予用户,这样就简化了用户权限的定义。
三、视图的四种类型
1.关系视图:
关系视图(relational view)基本上就是经过存储的查询,可以将它的输出看作是一个表。它就是基于关系数据的存储对象。
2.内嵌视图:
又称为嵌套查询,是嵌入到父查询中的查询,能够在任何可以使用表名称的地方使用。
3.对象视图(不演示):
为了迎合数据库中对象类型而将关系表投射到特定数据类型的虚拟对象表中,视图的每行都是带有属性、方法和唯一标识(OID)的对象实例。
4.物化视图(不演示):
就是在数据库中查询结果存储在视图中,并支持查询重写、刷新、提交等特性的视图。
4、视图的创建及管理
- 关系视图
创建语法:
CREATE [OR REPLACE] [FORCE] VIEW view_name [(alias[, alias]...)] AS select_statement [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY];
查看视图(可以通过User_views,All_views,Dba_views来查询视图信息):
--案例: select * from user_views;--查看当前用户创建的视图
创建普通关系视图【可对视图执行DML操作】:
--使用scott身份登录,创建视图emp表的简单视图 create view view_emp as select * from emp; select * from view_emp; update view_emp set sal=3200 where sal=3000 delete view_emp where rownum=1;
创建只读视图:
--特点:顾名思义,只读,不能执行其他DML操作 create or replace view view_emp as select * from emp where sal>=3000 with read only;
创建检查视图:
--特点:执行DML操作时,自动检测是否满足创建视图时所建立的where条件,如果不满足,直接出错 create or replace view view_emp as select * from emp where sal>=3000 with check option;
创建复杂视图:
--特点: 复杂视图是指包含函数、表达式或分组数据的视图,主要目的是为了简化查询 create or replace view view_emp as select count(*) 人数,avg(sal+nvl(comm,0)) 平均工资,deptno 部门编号 from emp group by deptno;
创建强制视图:
/* 特点:正常情况下,如果基表不存在,创建视图就会失败。但是可以使用FORCE选项强制创建视图(前提是创建视图的语句没有语法错误), 但此时该视图处于失效状态,调用会出错,直到这个基表已经存在 */ create or replace FORCE view view_test as select * from myemp;
视图上的DML语句有如下限制:
①.只能修改一个底层的基表。②.如果修改违反了基表的约束条件,则无法更新视图。③.如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图。④.如果视图包含伪列或表达式,则将无法更新视图。内嵌视图
概述:
内嵌视图就是嵌入到父查询中的查询,能够在任何可以使用表名称的地方使用。
内嵌视图又称为嵌套查询。
嵌视图可以出现在SELECT语句的FROM子句中,以及INSERT INTO、UPDATE甚至是DELETE FROM语句中。
内嵌视图是临时的,它只存在于父查询的运行期间。--案例: select * from (select e.*,rownum rn from emp e) tab where rn>=5 and rn<=10; --其中: select e.*,rownum rn from emp e就是一个内嵌视图,临时有效