一、什么是视图
视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视 图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。
(1)视图的优点
使用视图的优点:
1.简化数据操作:视图可以简化用户处理数据的方式。
2.着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
3.视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
4.提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
(2)创建或修改视图语法
create [or replace] [force] view view_name as subquery [with check option ] [with read only] |
选项解释:
OR REPLACE | 若所创建的试图已经存在,ORACLE 自动重建该视图 |
FORCE | 不管基表是否存在 ORACLE 都会自动创建该视图 |
subquery | 一条完整的 SELECT 语句,可以在该语句中定义别名; |
WITH CHECK OPTION | 插入或修改的数据行必须满足视图定义的约束; |
WITH READ ONLY | 该视图上不能进行任何 DML 操作 |
(3)视图案例
1-简单视图的创建与使用
什么是简单视图?如果视图中的语句只是单表查询,并且没有聚合函数,我们就称之为简单视图。
需求:创建视图:业主类型为 1 的业主信息
语句:
create or replace view view_owners1 as select * from t_owners where ownertypeid=1 |
利用该视图进行查询
select * from view_owners1 where addressid=1; |
2-带检查约束的视图
需求:根据地址表( T_ADDRESS)创建视图 VIEW_ADDRESS2 , 内容为区域 ID 为 2 的记录。
语句:
create or replace view view_address2 as select * from T_ADDRESS where areaid=2 with check option |
执行下列更新语句:
update view_address2 set areaid=1 where id=4 |
此时会有提示是:
案例
-- todo 1 创建视图: 查询 区域类型为 3 的地址信息, 携带 with check option |
实现
-- todo 1 创建视图: 查询 区域类型为 3 的地址信息, 携带 with check option
|
3-只读视图的创建与使用
如果我们创建一个视图,并不希望用户能对视图进行修改,那我们就需要创建视
图时指定 WITH READ ONLY 选项,这样创建的视图就是一个只读视图。
需求:将上边的视图修改为只读视图
语句:
create or replace view view_owners1 as select * from T_OWNERS where ownertypeid=1 with read only |
修改后,再次执行 update 语句,会出现如下错误提示
update view_owners1 set name='和珅' where id=2; |
案例
-- todo 1 创建视图: 查询 区域类型为 3 的地址信息, 只读 |
实现
-- todo 1 创建视图: 查询 区域类型为 3 的地址信息, 只读 |
4-创建带错误的视图
我们创建一个视图,如果视图的 SQL 语句所设计的表并不存在,如下
create or replace view view_temp as select * from t_temp |
T_TEMP 表并不存在,此时系统会给出错误提示
有的时候,我们创建视图时的表可能并不存在,但是以后可能会存在,我们如果
此时需要创建这样的视图,需要添加 FORCE 选项,SQL 语句如下:
create or replace force view view_temp as select * from t_temp |
此时视图创建成功。
二、物化视图
(1)什么是物化视图
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。
而对一个物化视图查询的执行效率与查询一个表是一样的。
(2)创建物化视图语法
create materialized view view_name [build immediate | build deferred ] refresh [fast|complete|force] [ on [commit | demand ] | start with (start_time) next (next_time) ] as subquery |
- BUILD IMMEDIATE 是在创建物化视图的时候就生成数据
- BUILD DEFERRED 则在创建时不生成数据,以后根据需要再生成数据。
- 默认为 BUILD IMMEDIATE。
- 刷新( REFRESH ):指当基表发生了 DML 操作后,物化视图何时采用哪种方式和基表进行同步。
- REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。
- FAST 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
- COMPLETE 刷新对整 个物化视图进行完全的刷新。
- 如果选择 FORCE 方式,则 Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式,FORCE 是默认的方刷新的
- 模式有两种:ON DEMAND 和 ON COMMIT 。
- ON DEMAND 指需要 手动刷新物化视图(默认)。
- ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。