一. 视图
1.1 什么是视图
视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,
而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。
根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,
它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。
使用视图的优点:
- 1.简化数据操作: 视图可以简化用户处理数据的方式。
- 2.着重于特定数据: 不必要的数据或敏感数据可以不出现在视图中。
- 3.视图的安全机制: 可以定制不同用户对数据的访问权限。
- 4.提供向后兼容性: 视图使用户能够在表的架构更改时为表创建向后兼容接口。
视图可以包含视图
1.2 创建或修改视图语法
CREATE [OR REPLACE] [FORCE] VIEW 表名
AS subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]
选项解释:
OR REPLACE :若所创建的试图已经存在,ORACLE 自动重建该视图;
FORCE :不管基表是否存在 ORACLE都会自动创建该视图;
subquery :一条完整的 SELECT 语句,可以在该语句中定义别名;
WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;
不能修改视图生成时,where条件中的列
WITH READ ONLY :该视图上不能进行任何 DML 操作。
3.删除视图语法
DROP VIEW 表名
4.案例
a)简单视图的创建与使用
1.什么是简单视图?如果视图中的语句只是单表查询,并且没有聚合函数,我们就称之为简单视图。
2.对于简单视图,可以查询,增删改记录。(把视图看做一张表进行操作)
3.视图是一个虚拟的表,数据来自于表。
(1)如果更改了视图的数据,表的数据也自然会变化,
(2)更改了表的数据,视图也自然会变化。
(3)一个视图所存储的并不是数据,而是一条 SQL语句。
b) 带检查约束的视图
create or replace view view_address2 as
select * from T_ADDRESS
where areaid=2
with check option
*不能修改视图生成时,where条件中的列
c)只读视图:只能读取
d)创建带错误的视图
如果视图的 SQL 语句所设计的表并不存在,会创建失败
有的时候,我们创建视图时的表可能并不存在,但是以后可能会存在,我们如果
此时需要创建这样的视图,需要添加 FORCE 选项,SQL语句如下:
create or replace FORCE view view_TEMP as select * from T_TEMP
f)复杂视图的创建与使用
视图的SQL语句中,有聚合函数或多表关联查询。
(1)多表关联查询的例子
键保留表的字段是可以更新的,而非键保留表是不能更新的
什么叫键保留表呢?
键保留表是理解连接视图修改限制的一个基本概念。
该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。
也就是说,表的键值在一个视图中也是键值,那么就称这个表为键保留表。
***持有外键的那张表是键保留表
(2)分组聚合统计
聚合统计视图是没有键保留表的,并且只能读取
二. 物化视图
2.1 什么是物化视图
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致
这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。
而对一个物化视图查询的执行效率与查询一个表是一样的。
2.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
a)BUILD
BUILD IMMEDIATE 是在创建物化视图的时候就生成数据
BUILD DEFERRED 则在创建时不生成数据,以后根据需要再生成数据。
默认为 BUILD IMMEDIATE。
b)REFRESH: //怎么刷新
指当基表发生了 DML操作后,物化视图何时采用哪种方式和基表进行同步。
REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。
FAST :刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
COMPLETE :刷新对整个物化视图进行完全的刷新。
FORCE :则 Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE
的方式。
FORCE 是默认的方式。
执行fast需要建立日志
c)刷新的模式有两种:ON DEMAND 和 ON COMMIT。 //在什么时候刷新
ON DEMAND 指需要手动刷新物化视图(默认)。
ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。
d)创建手动刷新的物化视图
需求:查询地址 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
1.手动刷新物化视图:
begin
DBMS_MVIEW.refresh('MV_ADDRESS','C');
end;
2.在命令SQL窗口刷新
EXEC DBMS_MVIEW.refresh('表名','C'); //'C':是COMPLETE的缩写
e).创建时不生成数据的物化视图
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;
**创建时不生成数据时候,第一查询要手动刷新
f)创建增量刷新的物化视图
创建增量刷新的物化视图,必须要有物化视图日志:记录基表发生了那些变化,(提交之后会清空日志)用这些记录去更新物化视图
创建物化视图中的语句中,with后面关联的列,基表中必须有
**如果创建增量刷新的物化视图,必须首先创建物化视图日志
eg: create materialized view log on t_address with rowid;
create materialized view log on t_area with rowid
创建的物化视图日志名称为 MLOG$_表名称
注意:创建增量刷新的物化视图,必须:
1. 创建物化视图中涉及表的物化视图日志。
2. 在查询语句中,必须包含所有表的 rowid ( 以 rowid方式建立物化视图日志 )
g)删除物化视图
drop materialized view 表名
三. 序列
1.什么事序列
序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。
2.创建与使用序列 //序列也是个伪列
create sequence 序列名
通过序列的伪列来访问序列的值
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值
提取下一个值
select 序列名称.nextval from dual
提取当前值
select 序列名称.currval from dual
注意:我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。
3.创建复杂序列
语法:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
默认为20,默认cache,一次从磁盘中拿出20个,存储到内存中,用完后们再次从硬盘中拿取数据
4.案例
a)循环的序列,第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环。
b)循环的序列必须指定最大值
c)带缓存的序列
我们执行下列语句:
create sequence seq_test3
increment by 10
start with 10
maxvalue 501
minvalue 5
cycle
cache 50;
***缓存设置的数必须小于每次循环的数
视图和物化视图的区别?
视图是一张虚拟的表:视图可以封装一些数据,把数据隐藏起来,只给使用者看到一部分信息,(信息安全),简化sql语句
物化视图:创建一个具体的表,提高查询速度
为什么要用序列? :oracle中没有自动增长,我们插入表的时候要从序列中取值.
同义词有多什么作用 :操作同义词和操作它本身是一致的.
private的具有dba权限的用户可以通过表名.同义词查询,所有用户公共的都可以访问
5.修改和删除序列
修改序列:使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START WITH 参数
ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
删除序列:
DROP SEQUENCE 序列名称;
四. 同义词
4.1 什么是同义词
同义词实质上是指定方案对象的一个别名。同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的 SQL语句复杂度。
4.2 创建与使用同义词
create [public] SYNONYM synooym for object;
其中 synonym表示要创建的同义词的名称,
object表示表,视图,序列等我们要创建同义词的对象的名称
1.私有同义词
create synonym OWNERS for T_OWNERS;
2.2.公有同义词
create public synonym OWNERS2 for T_OWNERS;
五. 索引 (查询快)
5.1 什么是索引
索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。
索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)
5.2 普通索引
create index 索引名称 on 表名(列名);
5.3 唯一索引
如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可以创建唯一索引。
create unique index 索引名称 on 表名(列名);
5.4 复合索引
应用场景: 经常要对某几列进行查询进行查询时使用
create index 索引名称 on 表名(列名,列名.....);
5.5 反向键索引
应用场景: 当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。
create index 索引名称 on 表名(列名) reverse;
5.6 位图索引
使用场景: 位图索引适合创建在低基数列上 ,也就是列中的内容确定且不多的情况下
优点: 减少响应时间,节省空间占用
create bitmap index 索引名称 on 表名(列名);