1、视图

1.1、什么是视图

视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。
根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。
使用视图的优点:
1.简化数据操作:视图可以简化用户处理数据的方式。
2.着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
3.视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
4.提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。

1.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 操作。

1.3、删除视图语法

DROP VIEW view_name

1.4、案例

1.4.1、简单视图的创建与使用

什么是简单视图?如果视图中的语句只是单表查询,并且没有聚合函数,我们就称之为简单视图。
需求:创建视图 :业主类型为 1 的业主信息
语句:

create or replace  view  view_owners1 as
select * from t_owners where ownertypeid ='1'


利用该视图进行查询

select * from view_owners1 where addressid=1;


就像使用表一样去使用视图就可以了。
对于简单视图,我们不仅可以用查询,还可以增删改记录。
我们下面写一条更新的语句,试一下:

update view_owners1 set name='王刚' where id=2;


再次查询:

select * from view_owners1


结果已经更改成功。
我们再次查询表数据

select * from t_owners


发现表的数据也跟着更改了。由此我们得出结论:视图其实是一个虚拟的表,它的数据其实来自于表。如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。一个视图所存储的并不是数据,而是一条SQL
语句。

1.4.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

系统提示如下错误信息:


这是因为带有约束的视图不能修改条件值。

1.4.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=1;

1.4.4、. 创建带错误的视图

我们创建一个视图,如果视图的 SQL 语句所设计的表并不存在,如下

create or replace view view_TEMP as
select * from T_TEMP


有的时候,我们创建视图时的表可能并不存在,但是以后可能会存在,我们如果此时需要创建这样的视图,需要添加 FORCE 选项,SQL 语句如下:

create or replace FORCE view view_TEMP as
select * from T_TEMP

此时视图创建成功。

1.4.5、复杂视图的创建与使用

所谓复杂视图,就是视图的 SQL 语句中,有聚合函数或多表关联查询。
我们看下面的例子:
(1)多表关联查询的例子
需求:
创建视图,查询显示业主编号,业主名称,业主类型名称
语句:

create or replace view view_owners as
select o.id 业主编号,o.name 业主名称,ot.name 业主类型
from T_OWNERS o,T_OWNERTYPE ot
where o.ownertypeid=ot.id


使用该视图进行查询

那这个视图能不能去修改数据呢?
我们试一下下面的语句:

update view_owners set 业主名称='范小冰' where 业主编号=1;

可以修改成功。
我们再试一下下面的语句:

update view_owners set 业主类型='普通居民' where 业主编号=1;

这次我们会发现,系统弹出错误提示:

这个是什么意思?是说我们所需改的列不属于键保留表的列。
什么叫键保留表呢?
键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表。
在我们这个例子中,视图中存在两个表,业主表(T_OWNERS)和业主类型表(T_OWNERTYPE), 其中 T_OWNERS 表就是键保留表,因为 T_OWNERS 的主键也是作为视图的主键。键保留表的字段是可以更新的,而非键保留表是不能更新的。
(2)分组聚合统计查询的例子
需求:创建视图,按年月统计水费金额
语句:

create view view_accountsum as
select year,month,sum(money) moneysum
from T_ACCOUNT
group by year,month
order by year,month


更新

update view_accountsum set moneysum =10000 where year='2012' and month='03'


原因是此例用到聚合函数,没有键保留表,所以无法执行 update 。

2、物化视图

2.1、什么是物化视图

视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语
句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。

2.2、创建物化视图语法

CREATE METERIALIZED 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 操作时自动刷新。

2.3、案例

1.创建手动刷新的物化视图
需求:查询地址 ID,地址名称和所属区域名称

create materialized view mv_address
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id

执行上边的语句后查询

select * from mv_address;


这时,我们向地址表(T_ADDRESS)中插入一条新记录,

insert into t_address values(8,'宏福苑小区',1,1);

再次执行上边的语句进行查询,会发现新插入的语句并没有出现在物化视图中。我们需要通过下面的语句(PL/SQL),手动刷新物化视图:

begin
DBMS_MVIEW.refresh('MV_ADDRESS','C');
end;

或者通过下面的命令手动刷新物化视图:

EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C');

注意:此语句需要在命令窗口中执行。执行此命令后再次查询物化视图,就可以查询到最新的数据了。


DBMS_MVIEW.refresh 实际上是系统内置的存储过程
2.创建自动刷新的物化视图,和上例一样的结果集
语句如下:

create materialized view mv_address2
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id

创建此物化视图后,当 T_ADDRESS 表发生变化时,MV_ADDRESS2 自动跟着改变。

3.创建时不生成数据的物化视图

create materialized view mv_address3
build deferred
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id;

创建后执行下列语句查询物化视图

select * from mv_address3


执行下列语句生成数据

begin
DBMS_MVIEW.refresh('MV_ADDRESS3','C');
end;


由于我们创建时指定的 on commit ,所以在修改数据后能立刻看到最新数据,无须再次执行 refresh
4.创建增量刷新的物化视图
如果创建增量刷新的物化视图,必须首先创建物化视图日志

create materialized view log on t_address with rowid;
create materialized view log on t_area with rowid

with后面一般跟主键或者rowid,表示根据指定列来刷新。
创建的物化视图日志名称为 MLOG$_表名称

创建物化视图

create materialized view mv_address4
refresh fast
as
select ad.rowid adrowid ,ar.rowid arrowid, ad.id,ad.name
adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id;

注意:创建增量刷新的物化视图,必须:

  1. 创建物化视图中涉及表的物化视图日志。
  2. 在查询语句中,必须包含所有表的 rowid ( 以 rowid 方式建立物化视图日志 ),当我们向地址表插入数据后,物化视图日志的内容:
    当我们向地址表插入数据后,物化视图日志的内容:

SNAPTIME$$:用于表示刷新时间。
DMLTYPE$$:用于表示 DML 操作类型,I 表示 INSERT,D 表示 DELETE,U表示 UPDATE。
OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)
表示旧值,U 表示 UPDATE 操作。
CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。
此列是 RAW 类型,其实 Oracle 采用的方式就是用每个 BIT 位去映射一个列。
插入操作显示为:FE, 删除显示为:OO 更新操作则根据更新字段的位置而显示不同的值。
向t_address表中插入数据,再次查看物化视图日志

insert into t_address values(10,'雅仕苑',1,1);

当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。

begin
DBMS_MVIEW.refresh('MV_ADDRESS4','C');
end;

06oracle视图与物化视图相关推荐

  1. 普通视图和物化视图的区别(转)

    物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的. 普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL ...

  2. Oracle物化视图与物化视图日志

    文章目录 物化视图 物化视图与普通视图的区别 创建一个存放person的表 创建一个存放person的address的表 初始化数据 创建物化视图的语句 1.build [immediate|defe ...

  3. Hive视图与物化视图

    文章目录 1. 视图 1.2 案例 1.3 视图的好处 2. Hive3.0新特性:Materialized View 物化视图 2.1 物化视图语法 2.2 基于物化视图的查询重写 1. 视图 Hi ...

  4. 普通视图和物化视图的区别

    物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的. 普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL ...

  5. 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

    目录 (一)前言 (二)正文 1. 物化视图(索引视图)与查询重写的基本概念 2. 创建测试环境 (1)建表 (2)写数据 3. 索引视图创建 (1)创建语法 (2)为索引视图创建索引 4. 查询重写 ...

  6. 数据库视图解析[普通视图、物化视图以及通过修改视图修改数据]

    1. 关系型数据库的视图 1.1. 视图 视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式 ...

  7. oracle物化视图和表的区别,数据库中普通视图和物化视图有什么区别?

    对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用. Refresh方法- COMPLETE子句 完全刷新重新生成整个视图,如果请求完全刷新,oracle会完成 完全刷新即使增量刷新可用 ...

  8. 普通视图和物化视图区别

    物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语 ...

  9. drop 很慢 物化视图_物化视图问题-效率捉摸不定

    问题: 物化视图在基表数据修改后未经提交就直接查询速度很慢,之后再提交也没有作用,必须要过一段时间才可恢复,具体见下测试,希望高手指点! --过程如下 CREATE MATERIALIZED VIEW ...

最新文章

  1. nginx基于IP的虚拟主机
  2. (转)搜索Maven仓库 获取 groupid artifactId
  3. mysql 5.0 to mysql 5.1的BTREE索引问题
  4. 硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统!
  5. 信息系统项目管理知识--知识产权与标准化
  6. ARM开发板系统移植-----kernel的编译
  7. sublime的Fatal pylint error: UnicodeDecodeError: 'ascii' codec can't decode byte 问题解决方案
  8. 华为手机怎么使用读卡器_华为手机使用小窍门
  9. ISA Server 2006 部署步骤
  10. 高性能服务器模型分类
  11. TensorFlow5-监督式机器学习基础知识
  12. 退出出库复核是什么意思_细思极恐!为什么是黄晓明退出而不是李菲儿?因为女方是芒果艺人...
  13. 知乎内容营销新动作:别处种草 知乎种树
  14. 影响大数据和分析的5大趋势
  15. php开源框架和平台(XAMPP、Wamp5和AppServ)简述
  16. HVM is required for this operation - Run Xen on Nested System
  17. 阿里巴巴Java开发 之 MySQL规约
  18. 防治计算机病毒教案,小学信息技术教案:《防治计算机病毒-计算机病毒》
  19. C++学习笔记 —— 回合制小游戏案例
  20. 07 ,矩阵的转置,矩阵的行列式,方阵 ( 2阶行列式,3阶行列式,n 阶行列式 ) :

热门文章

  1. oracle-1480,1400,1438错误一些解决方式
  2. IDEA 新UI使用
  3. css表格怎么垂直居中对齐,css表格垂直居中怎么设置?
  4. html表格上下居中
  5. python中面向对象的思想汇报_python试卷
  6. 计算字符串的相似度/华为机试(C/C++)
  7. 卡尔曼滤波系列——(一)标准卡尔曼滤波
  8. 个人博客制作——首页部分
  9. bookkeeper metadata 获取及密码安全
  10. 需求评审会如何做才不会沦为形式主义