视图是一种数据库对象
视图 => 封装sql语句 => 虚拟表
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 操作DROP VIEW view_name
简单视图:视图中的语句只是单表查询,并且没有聚合函数
-- 创建简单视图
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语句。
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
create or replace view view_owners1 as
select * from T_OWNERS where ownertypeid=1
with read only
尝试执行修改操作:
我们创建一个视图,如果视图的 SQL 语句所设计的表并不存在
CREATE FORCE VIEW view_TEMP AS
SELECT * FROM T_TEMP
用途:表会运行时产生
复杂视图:视图的 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;
只能修改**键保留表(主键所在的那个表)**的数据
-- 创建视图,按年月统计水费金额
create view view_accountsum as
select year,month,sum(money) moneysum
from T_ACCOUNT
group by year,month
order by year,month
此例用到聚合函数,没有键保留表,所以无法执行 update
。
物化视图与普通的视图相比的区别是物化视图是建立的副本。
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 操作时自动刷新drop materialized view view_address1
-- 创建手动刷新的物化视图
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,完全刷新
-- 创建自动刷新的物化视图
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
第一次必须手动刷新,之后(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;
物化视图日志:记录基表发生了哪些变化,用这些记录去更新物化规图
如果创建增量刷新的物化视图,必须首先创建物化视图日志
-- 创建物化视图日志
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 方式建立物化视图日志)
当我们手动刷新物化视图后,物化视图日志被清空,物化视图更新。
序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。
类似于mysql的自动增长
-- 创建序列
create sequence 序列名称
通过序列的伪列来访问序列的值
NEXTVAL
:返回序列的下一个值CURRVAL
:返回序列的当前值我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。
-- 提取下一个值
select 序列名称.nextval from dual
-- 提取当前值
select 序列名称.currval from dual
-- 创建序列名称
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}];
修改序列:使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START
ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
DROP SEQUENCE 序列名称;
create sequence seq_test1
increment by 10
start with 10
maxvalue 300
minvalue 5;
当序列值为最大值的时候再次提取值,系统会报异常信息。
create sequence seq_test2
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle;
第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环
create sequence seq_test5
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;
指定方案对象的一个别名
create [public] SYNONYM synooym for object;
synonym
:要创建的同义词的名称object
:表,视图,序列等要创建同义词的对象的名称public
-- 创建私有同义词
create synonym OWNERS for T_OWNERS;
-- 使用私有同义词
select * from OWNERS;
以另外的用户登陆,也可以使用公有同义词
-- 创建公有同义词
create public synonym OWNERS2 for T_OWNERS;
-- 使用公有同义词
select * from OWNERS2;
相当于书的目录、字典的索引
索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于一棵"树"。
树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列ROWID
。
create index 索引名称 on 表名(列名);
如果索引列的值是不会重复的,可以创建唯一索引。
create unique index 索引名称 on 表名(列名);
基于两个以上的列建立一个索引
create index 索引名称 on 表名(列名,列名.....);
当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。会增加查询的层数,性能会下降。
建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。
create index 索引名称 on 表名(列名) reverse;
位图索引适合创建在低基数列上 。
位图索引不直接存储 ROWID
,而是存储字节位到 ROWID
的映射。
减少响应时间,节省空间占用。
create bitmap index 索引名称 on 表名(列名);