八、视图
视图是一个虚表,不占用物理空间,因为视图本身的定义语句存储在数据字典里,视图中的数据是一个或多个实际表中获得的。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
1. 视图的优点:
1) 提供了另外一种级别的表安全性
2) 隐藏的数据的复杂性:一个视图可能是用多表连接定义的,但用户不需要知道多表连接的语句也可以查询数据。
3) 简化的用户的SQL命令:查询视图的时候不需要写出复杂的查询语句,只需要查询视图名称即可。
4) 隔离基表结构的改变:视图创建好了之后,如果修改了表的结构,也不会影响视图的。
5)通过重命名列,从另一个角度提供数据:例如在销售系统中,每日下班前要对当日数据进行汇总,在销售人员眼中,该汇总表成为日销售统计表,在财务人眼中,该销售表成为销售日报表
2. 创建视图
参数解释:
OR REPLACE:如果视图已存在,此选项将重新创建该视图。
FORCE:如果使用此关键字,则无论基表是否存在,都将创建视图。
NOFORCE:这是默认值,如果使用此关键字,则仅当基表存在时才创建视图。
VIEW_NAME:要创建视图的名称
Alias:指定由视图的查询所选择的表达式或列的别名。别名的数目必须与视图所选择的表达式的数目相匹配。
Select_statement:select语句
WITH CHECK OPTION :此选项指定只能插入或更新视图可以访问的行。术语constraint表示为CHECK OPTION约束指定的名称。
WITH READ ONLY:此选项保证不能在此视图上执行任何修改操作。
3. DML语句和复杂视图
DML语句是指用于修改数据的insert、delete和update语句。因为视图是一个虚拟的表,所以这些语句也可以与视图一同使用。一般情况下不通过视图修改数据,而是直接修改基表,因为这样条例更清晰。
在视图上使用DML语句有如下限制(相对于表)。
1)DML语句只能修改视图中的一个基表。
2)如果过记录的修改违反了基表的约束条件,则将无法更新视图。
3)如果创建的视图包含连接运算符,DISTINCT运算符、集合运算符、聚合函数和groupby子句,则将无法更新视图。
4)如果创建的视图包含伪列表达式,则将无法更新视图。
简单视图基于单个基表,不包括函数和分组函数,那么可以在此视图中进行insert、update、delete操作,这些操作实际上在基表中插入、更新和删除行。
复杂视图从多个表提取数据,包括函数分组函数。复杂视图不一定能进行DML操作。
4. 查询视图
select view_name from user_views;
5. 删除视图
drop view view_name;
6. 物化视图
含义:就是具有物理存储的特殊视图,占据物理空间,就像表一样
是远程数据的本地副本,或者用来生成基于数据表求和的汇总表
物化视图中两个重要概念:查询重写和物化视图同步
(1)查询重写:对sql语句进行重写,当用户使用sql语句对基表进行查询时,如果已经建立了基于这些表的物化视图,oracle将自动计算和使用物化视图来完成查询,在某些情况下可以节约查询时间,减少系统i/o。Oracle将这种查询优化技术成为查询重写。参数QUERY_REWRITE_ENABLED决定是否使用重写查询,该参数为布尔型。在创建物化视图需要用ENABLE_QUERY REWRITE来启动查询重写功能。通过SHOW指令可以查看该参数的值。
(2)物化视图的同步:
物化视图是基于表创建的,所以当基表变化时,需要同步数据以更新物化视图中的数据,这样保持物化视图中的数据和基表的数据一致性。Oracle提供了两种物化视图的刷新方式,决定何时进行刷新,即ON COMMIT方式和ON DEMAND方式。
ON COMMIT方式:指物化视图在对基表的DML操作事务提交的同时进行刷新。
ON DEMAND方式:指物化视图在用户需要的时候进行更新,可以手工通过DBMS_MVIEW.REFRESH等方式来进行刷新,也可以通过JOB定时进行刷新。
选择刷新方式之后,还需要选择一种刷新类型,刷新类型指定刷新时基表与物化视图如何实现数据的同步,oracle提供了以下4种刷新类型。
COMPLETE:对整个物化视图进行完全的刷新。
FAST:采用增量刷新,只刷新自上次刷新后进行的修改。
FORCE:oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE方式。
NEVER:物化视图不进行任何刷新。
默认值是FORCE刷新类型。
创建物化视图
(1)授予权限,具备创建物化视图的权限、QUERY REWRITE的权限,以及对创建物化视图所涉及的表的访问权限和创建表的权限。
通过SCOTT用户来演示
(2)创建物化视图日志
(3)创建物化视图语句
其中:
bulid immediate:该参数的含义是立即创建物化视图,也可以选择build deffered,该参数说明在物化视图定以后不会立即执行,而是延迟执行,在使用该视图时再创建。
Reffesh fast:刷新数据的类型选择FAST类型。
ON COMMIT:在基表有更新时提交后立即更新物化视图。
ENABLE QUERY REWRITE:启动查询重写功能。在创建物化视图时明确说明启用查询重写功能。
As:定义后面的查询语句。
查询体:物化视图的查询内容,该sql语句的查询结果集输出到物化视图中,保存在由oracle自动创建的表中。
(4)删除物化视图
drop materialized view view_name;
九、序列
序列是用来生成唯一、连续的整数数据库对象。序列通常用来自动生成主键或唯一键的值。序列可以按升序排列,也可以按降序排列。
1. 创建序列
参数解释:
- START WITH:指定要生成的第一个序列号,对于升序序列,其默认值为序列的最小值,对于降序序列,其默认值为序列的最大值。
- INCREMENT BY:用于指定序列号之间的间隔,默认值为1,如果n为正值,则生成的序列将按升序排序,如果n为负值,则生成的序列按降序排列。
- MAXVALUE:指定序列可以生成的最大值
- NOMAXVALUE:如果指定了NOMAXVALUE,oracle将升序序列的最大值设为1027,将降序序列的最大值设为-1。
- MINVALUE:指定序列最小值。MINVALUE必须小于或等于START WITH的值,并且必须小于MAXVALUE。
- NOMINVALUE:如果指定了NOMINVALUE,oracle将升序序列的最小值设为1,或将降序列的值设置为-1026。
- CYCLE:指定序列在达到最大值或最小值后,将继续从头开始生成值。
- NOCYCLE:指定序列在达到最大值或最小值后,将不在继续生成值。
- CHCHE:使用CACHE选项可以预先分配一组序列号,并将其保留在内存中,这样可以更快地访问序列号,当用完缓存中的所有序列号时,oracle将生成另一组数值,并将其保留在缓存中。
- NOCACHE:使用NOCACHE选项,则不会为加快访问速度而预先分配序列号。如果在创建序列时忽略了CACHE和NOCACHE选项,oracle将默认缓存20个序列号。
2. 访问序列
创建了序列之后,可以通过NEXTVAL和CURRVAL伪列来访问该序列的值。可以从伪列中选择值。但是不能操纵他们的值。
NETXVAL:创建序列后第一次使用NEXTVAL时,将返回该序列的初始值。以后再引用NETXVAL时,将使用INCREMENT BY子句的值来增加序列值,并返回这个新值。
CURRVAL:返回序列的当前值,即最后一次引用NEXTVAL时返回的值
举例:
创建序列
创建表
插入数据
查看数据
查看序列的当前值