【Oracle】数据库对象

本文详细介绍了Oracle数据库中的视图概念、优点、创建与修改方法,包括简单视图、带检查约束的视图、只读视图等。此外,还涵盖了物化视图的创建、序列的使用、同义词的作用以及不同类型索引的构建和优化技巧。
摘要由CSDN通过智能技术生成

一、视图

1、视图概述

视图是一种数据库对象

视图 => 封装sql语句 => 虚拟表

2、视图的优点
  1. 简化操作:视图可以简化用户处理数据的方式。
  2. 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
  3. 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
  4. 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
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;

创建增量刷新的物化视图的条件:

  1. 创建物化视图中涉及表的物化视图日志
  2. 在查询语句中,必须包含所有表的 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 表名(列名);

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wmh1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值