一、视图
1、视图概述
视图是一种数据库对象
视图 => 封装sql语句 => 虚拟表
2、视图的优点
- 简化操作:视图可以简化用户处理数据的方式。
- 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
- 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
- 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
3、视图的创建与修改
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 操作
4、视图的删除
DROP VIEW view_name
5、案例
1)简单视图
简单视图:视图中的语句只是单表查询,并且没有聚合函数
-- 创建简单视图
CREATE 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
视图其实是一个虚拟的表,它的数据其实来自于表。
如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。
一个视图所存储的并不是数据,而是一条 SQL语句。
2)带检查约束的视图
create view view_address2 as
select * from T_ADDRESS where areaid=2
with check option
-- 无法修改的条件:因为视图的条件是areaid=2
update view_address2 set areaid=1 where id=4
3)只读视图
create or replace view view_owners1 as
select * from T_OWNERS where ownertypeid=1
with read only
尝试执行修改操作:
4)带错误的视图
我们创建一个视图,如果视图的 SQL 语句所设计的表并不存在
CREATE FORCE VIEW view_TEMP AS
SELECT * FROM T_TEMP
用途:表会运行时产生
5)复杂视图
1. 多表关联查询
复杂视图:视图的 SQL 语句中,有聚合函数或多表关联查询
-- 创建复杂视图
CREATE VIEW view_owners AS
SELECT
o.id 业主编号,
o.name 业主名称,
ot.name 业主类型
FROM
T_OWNERS o,
T_OWNERTYPE ot
WHERE
o.ownertypeid = ot.id
-- 查询复杂视图
select * from view_owners
-- 修改复杂视图
update view_owners set 业主名称='范小冰' where 业主编号=1;
只能修改**键保留表(主键所在的那个表)**的数据
2. 分组聚合统计查询
-- 创建视图,按年月统计水费金额
create view view_accountsum as
select year,month,sum(money) moneysum
from T_ACCOUNT
group by year,month
order by year,month
此例用到聚合函数,没有键保留表,所以无法执行 update
。
二、物化视图
1、物化视图概述
物化视图与普通的视图相比的区别是物化视图是建立的副本。
- 优点:查询效率高
- 缺点:占用存储空间
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 操作后,物化视图何时采用哪种方式和基表进行同步FAST
:增量刷新,通过日志修改COMPLETE
:完全刷新,每次修改之后重新生成FORCE
:自动选择,判断是否可以进行快速刷新,如果可以则采用FAST
方式,否则采用COMPLETE
的方式(FORCE
是默认的方式)
- 刷新的模式
ON DEMAND
:需要手动刷新物化视图(默认)ON COMMIT
:基表发生 COMMIT 操作时自动刷新
3、物化视图创建
drop materialized view view_address1
4、案例
1)手动刷新
-- 创建手动刷新的物化视图
CREATE MATERIALIZED VIEW mv_address
AS
SELECT
ad.id,
ad.name ad_name,
ar.name ar_name
FROM
t_address ad,
t_area ar
WHERE
ad.areaid = ar.id
-- 查询物化视图
select * from mv_address
手动刷新物化视图
-- 1、PL/SQL
BEGIN
DBMS_MVIEW.refresh ( 'MV_ADDRESS', 'C' );
END;
### 2、sql命令窗口
EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C');
c
:COMPLETE,完全刷新
2)自动刷新
-- 创建自动刷新的物化视图
CREATE MATERIALIZED VIEW mv_address2
refresh
ON commit
AS
SELECT
ad.id,
ad.name ad_name,
ar.name ar_name
FROM
t_address ad,
t_area ar
WHERE
ad.areaid = ar.id
3)不生成数据
第一次必须手动刷新,之后(ON commit
)会自动刷新
-- 创建不生成数据的物化视图
CREATE MATERIALIZED VIEW mv_address3
build deferred
refresh
ON commit
AS
SELECT
ad.id,
ad.name ad_name,
ar.name ar_name
FROM
t_address ad,
t_area ar
WHERE
ad.areaid = ar.id;
4)增量刷新
物化视图日志:记录基表发生了哪些变化,用这些记录去更新物化规图
如果创建增量刷新的物化视图,必须首先创建物化视图日志
-- 创建物化视图日志
create materialized view log on t_address with rowid;
create materialized view log on t_area 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;
创建增量刷新的物化视图的条件:
- 创建物化视图中涉及表的物化视图日志
- 在查询语句中,必须包含所有表的 rowid(以 rowid 方式建立物化视图日志)
当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。
三、序列
1、序列概述
序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。
类似于mysql的自动增长
2、简单序列
-- 创建序列
create sequence 序列名称
通过序列的伪列来访问序列的值
NEXTVAL
:返回序列的下一个值CURRVAL
:返回序列的当前值
我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。
-- 提取下一个值
select 序列名称.nextval from dual
-- 提取当前值
select 序列名称.currval from dual
3、复杂序列
-- 创建序列名称
CREATE SEQUENCE sequence
-- 递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减,默认是 1
[INCREMENT BY n]
-- 开始的值,递增默认是 minvalue 递减是 maxvalue
[START WITH n]
-- 最大值
[{MAXVALUE n | NOMAXVALUE}]
-- 最小值
[{MINVALUE n | NOMINVALUE}]
-- 循环/不循环
[{CYCLE | NOCYCLE}]
-- 分配并存入到内存中
[{CACHE n | NOCACHE}];
4、修改序列
修改序列:使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START
ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
5、删除序列
DROP SEQUENCE 序列名称;
6、案例
1)有最大值的非循环序列
create sequence seq_test1
increment by 10
start with 10
maxvalue 300
minvalue 5;
当序列值为最大值的时候再次提取值,系统会报异常信息。
2)有最大值的循环序列
create sequence seq_test2
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle;
第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环
3)带缓存的序列
create sequence seq_test5
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;
四、同义词
1、同义词概述
指定方案对象的一个别名
2、同义词的创建与使用
create [public] SYNONYM synooym for object;
synonym
:要创建的同义词的名称object
:表,视图,序列等要创建同义词的对象的名称public
- 私有同义词:只有当前用户能用
- 公有同义词:所有的用户都可以使用
3、案例
1)私有同义词
-- 创建私有同义词
create synonym OWNERS for T_OWNERS;
-- 使用私有同义词
select * from OWNERS;
2)公有同义词
以另外的用户登陆,也可以使用公有同义词
-- 创建公有同义词
create public synonym OWNERS2 for T_OWNERS;
-- 使用公有同义词
select * from OWNERS2;
五、索引
1、索引概述
相当于书的目录、字典的索引
索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于一棵"树"。
树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列ROWID
。
- 优点:查询效率高
- 缺点:占用存储空间
2、普通索引
create index 索引名称 on 表名(列名);
3、唯一索引
如果索引列的值是不会重复的,可以创建唯一索引。
create unique index 索引名称 on 表名(列名);
4、复合索引
基于两个以上的列建立一个索引
create index 索引名称 on 表名(列名,列名.....);
5、反向键索引
当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。会增加查询的层数,性能会下降。
建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。
create index 索引名称 on 表名(列名) reverse;
6、位图索引
位图索引适合创建在低基数列上 。
位图索引不直接存储 ROWID
,而是存储字节位到 ROWID
的映射。
减少响应时间,节省空间占用。
create bitmap index 索引名称 on 表名(列名);