Oracle-6 对象

6.1、视图

6.1.1、视图简介

视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果

根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。

使用视图的优点:

  1. 简化数据操作:视图可以简化用户处理数据的方式

  1. 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中

  1. 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限

  1. 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口

6.1.2、创建修改视图

语法:

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操作

6.1.3、删除视图

DROP VIEW VIEW_NAME

6.1.4、案例

简单视图的创建与使用

如果视图中的语句只是单表查询,并且没有聚合函数,就称之为简单试图

--创建业主类型为1的业主信息
CREATE VIEW VIEW_OWNERS AS
SELECT*FROM T_OWNERS WHERE OWNERTYPEID=1
--查询视图
SELECT*FROM VIEW_OWNERS
--修改视图数据
UPDATE VIEW_OWNERS SET NAME='张三'WHERE ID=1

注:视图其实是一个虚拟的表,它的数据来自于表。如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。一个视图所存储的并不是数据,而是一条 SQL语句。

带检查约束的视图
--根据地址表创建视图,内容为区域id为2的记录
CREATE VIEW VIEW_ADDRESS
AS
SELECT*FROM T_ADDRESS WHERE AREAID=2
WITH CHECK OPTION
--若想要修改区域id,由于检查约束会显示修改失败
UPDATE VIEW_ADDRESS SET AREAID=4WHERE ID=4
只读视图
--创建只读视图,若视图已存在直接修改
CREATE OR REPLACE VIEW VIEW_ADDRESS
AS
SELECT*FROM T_ADDRESS WHERE AREAID=2
WITH READ ONLY
带错误的视图

如果视图的SQL语句所设计的表不存在,此时系统会给出错误提示

--创建错误视图
CREATE VIEW VIEW_TEMP
AS
SELECT*FROM T_TEMP
--强制创建
CREATE FORCE VIEW VIEW_TEMP
AS
SELECT*FROM T_TEMP
复杂视图

视图中的SQL语句中含有聚合函数或多表关联的查询

--创建视图,显示业主编号,业主名称业主类型名称
CREATE VIEW VIEW_1
AS
SELECT T.ID 业主编号,T.NAME 业主名称, OT.NAME 业主类型
FROM T_OWNERS T,T_OWNERTYPE OT
WHERE T.OWNERTYPEID=OT.ID
--可修改复杂视图的数据
UPDATE VIEW_1
SET 业主名称='张三'WHERE 业主编号=4
--不可修改(键保留表)
UPDATE VIEW_1
SET 业主类型='商业'WHERE 业主编号=4

键保留表就是把主键保留下来的表,即结果中作为主键的及主键所在表的相关数据的表。在多表查询的视图中,只能修改键保留表中的数据,不能修改其他表的数据

--分组聚合统计创建视图
--创建视图,按年月统计水费金额
CREATE VIEW VIEW_ACCOUNT
AS
SELECTYEAR,MONTH,SUM(MONEY) MONEY
FROM T_ACCOUNT
GROUPBYYEAR,MONTH
ORDERBYYEAR,MONTH
--无法修改数据
UPDATE VIEW_ACCOUNT 
SET MONEY=1000
WHEREYEAR='2012'AND MONTH='01'

聚合统计的视图中不存在键保留表,因此无法修改数据

6.2、物化视图

6.2.1、物化视图简介

视图时一个虚拟表(也可以认为时一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体试图)

物化视图与普通视图相比的区别在于物化视图是建立的副本,它类似于一张表,需要占用存储空间,而对一个物化视图查询的执行效率与查询一个表是一样的

6.2.2、创建物化视图

语法:

CREATE MATERIALIZED VIEW VIEW_NAME
[BUILD IMMEDIATE | BUILD DEFERRED]
REFRESH [FAST| COMPLICATE |FORCE]
[ON[COMMIT| DEMAND]|STARTWITH(START_TIME)NEXT(NEXT_TIME)]
AS SUBQUERY
  • BUILD IMMEDIATE:在创建物化视图时就生成数据

  • BUILD DEFERRED:在创建时不生成数据,以后根据需要在生成数据

默认为BUILD IMMEDIATE

  • 刷新(REFRESH):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步

  • REFRESH后跟着指定的刷新方式有三种

  • FAST:采用增量刷新,只刷新自上次刷新以后进行的修改

  • COMPLICATE:对整个物化视图进行完全的刷新

  • FORCE:自动选择,Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLICATE方式

默认是FORCE方式

刷新的模式:

  • ON DEMAND:需要手动刷新物化视图(默认)

  • ON COMMIT:在基表发生COMMIT操作时自动刷新

6.2.3、案例

创建手动刷新的物化视图
--查询地址ID,地址名称和所属区域名称
CREATE MATERIALIZED VIEW MV_ADD
AS
SELECT TA.ID 地址ID, TA.NAME 地址名称,TR.NAME 区域名称
FROM T_ADDRESS TA,T_AREA TR
WHERE TA.AREAID=TR.ID
删除物化视图
DROP MATERIALIZED VIEW MV_ADD
插入数据
--向基表插入数据
INSERT INTO T_ADDRESS VALUES(8,'荣盛花园',2,1)
COMMIT;
--刷新物化视图
BEGIN
 DBMS_MVIEW.refresh('MV_ADD','C');
END;
自动刷新的物化视图
--查询地址ID,地址名称和所属区域名称
CREATE MATERIALIZED VIEW MV_ADD1
REFRESH
ON COMMIT
AS
SELECT TA.ID 地址ID, TA.NAME 地址名称,TR.NAME 区域名称
FROM T_ADDRESS TA,T_AREA TR
WHERE TA.AREAID=TR.ID
创建时不生成数据的物化视图
--查询地址ID,地址名称和所属区域名称
CREATE MATERIALIZED VIEW MV_ADD1
BUILD DEFERRED
REFRESH
ON COMMIT
AS
SELECT TA.ID 地址ID, TA.NAME 地址名称,TR.NAME 区域名称
FROM T_ADDRESS TA,T_AREA TR
WHERE TA.AREAID=TR.ID
--查询时显示没有数据
--需要手动刷新才能生成数据
创建增量刷新的物化视图

创建增量刷新的物化视图,必须首先创建物化视图日志

--创建日志
CREATE MATERIALIZED VIEW LOG ON T_ADDRESS WITH ROWID
CREATE MATERIALIZED VIEW LOG ON T_AREA WITH ROWID

物化视图日志记录基表发生了哪些变化,用这些记录去更新物化视图

创建物化视图中的语句中,必须有基表的ROWID

--创建物化视图
CREATE MATERIALIZED VIEW MV_ADD3
REFRESH FAST
AS
SELECT TR.ROWID TRWORID,TA.ROWID TAROWID,TA.ID 地址ID, TA.NAME 地址名称,TR.NAME 区域名称
FROM T_ADDRESS TA,T_AREA TR
WHERE TA.AREAID=TR.ID
插入数据与手动刷新
--插入数据
INSERT INTO T_ADDRESS VALUES(9,'西三旗',2,1);
COMMIT;

物化视图日志内容:

  • ROWID

  • 执行时间

  • I/U/D:DML语言类型

  • O/N/U:新值/旧值/UPDATE

  • FE:数据的具体内容,转成二进制格式

--手动刷新
BEGIN
 DBMS_MVIEW.refresh('MV_ADD3','C');
END;

刷新结束后,物化视图日志清空

6.3、序列

序列是Oracle提供的用于产生一系列唯一数字的数据库对象

6.3.1、创建使用序列

创建简单序列
CREATE SEQUENCE SEQ_TEST
--查询序列的下一个值
SELECT SEQ_TEST.NEXTVALFROM DUAL --自动增长
--查询序列的当前值
SELECT SEQ_TEST.CURRVALFROM DUAL
创建复杂序列

语法:

CREATE SEQUENCE SEQ_NAME
    [INCREMENT BY N]--递增的序列值是n,n可正可负
    [START WITH N]--开始的值,递增默认为MINVALUE,递减默认为MAXVALUE
    [{MAXVALUE N | NOMAXVALUE}]--最大值
    [{MINVALUE N | NOMINVALUE}]--最小值
    [{CYCLE | NOCYCLE}]--循环|不循环
    [{CACHE N | NOCACHE}]--分配并存入内存中,默认20

6.3.2、案例

有最大值的非循环序列
CREATE SEQUENCE SEQ_TEST1
MAXVALUE 20;
自动增长的非循环序列
CREATE SEQUENCE SEQ_TEST2
INCREMENT BY 10
STARTWITH 10
MAXVALUE 100
循环的序列
CREATE SEQUENCE SEQ_TEST3
INCREMENT BY 10
STARTWITH 10
MINVALUE 10
MAXVALUE 201
CYCLE;

注:在循环条件下,每次循环的值(MAXVALUE-MINVALUE)要略大于缓存的数(CACHE*INCREMENT)

6.3.3、修改删除序列

--修改序列
ALTER SEQUENCE SEQ_NAME ...
ALTER SEQUENCE SEQ_TEST MAXVALUE 100;
--删除序列
DROP SEQUENCE SEQ_NAME;

使用ALTER SEQUENCE语句修改序列时,不能更改START WITH参数

6.4、同义词

同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。

同义词的易用性较好,降低了数据库用户的 SQL 语句复杂度同义词允许基对象重命名或者移动,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。

同义词分为公共同义词和私有同义词。其中,公共同义词属于PUBLIC特殊用户组,数据库的所有用户都能访问。而私有同义词包含在特定用户的方案中只允许特定用户或者有基对象访问权限的用户进行访问。

同义词本身不涉及安全,当你赋予一个同义词对象权限时,你实际上时在给同义词的基对象赋予权限,同义词只是基对象的一个别名。

6.4.1、创建使用同义词

语法:

CREATE[PUBLIC] SYNONYM SYN_NAME FOR OBJECT;
  • SYN_NAME:要创建的同义词名称

  • OBJECT:表示要创建的同义词的对象的名称,可以是表,视图,序列等

6.4.2、案例

私有同义词
CREATE SYNONYM OWNERS FOR T_OWNERS;
--通过同义词查询
SELECT*FROM OWNERS;
--跨用户访问,前提是dba
SELECT*FROM WATERUSER.OWNERS;
公有同义词
CREATE PUBLIC SYNONYM OWNERS1 FOR T_OWNERS;
--通过同义词查询
SELECT*FROM OWNERS1;
--跨用户访问表
SELECT*FROM OWNERS1;

VARCHAR是VARCHAR2的同义词,同义词大多数适用于兼容性设置

6.5、索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 I/O 次数,从而提高数据访问性能。

索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

6.5.1、普通索引

语法:

CREATE INDEX 名称 ON 表名(别名);
--基于某字段创建索引
CREATE INDEX INDEX_OWNERS_NAME ON T_OWNERS(NAME)

在建表时,指定某一列为主键的同时,系统默认为给列建立索引(唯一索引)

查询速度:ROWID>主键>一般列

6.5.2、唯一索引

如果需要在某个表的某一列创建索引,而这列的值是不会重复的。这时我们可以创建唯一索引

语法:

CREATE UNIQUE INDEX 名称 ON 表名(别名);

6.5.3、复合索引

如果经常需要对某几列进行查询,则可以建立复合索引,即基于两个及以上的列建立一个索引

语法:

CREATE INDEX 名称 ON 表名(列名1,列名2...)
--列名的前后顺序需要与where语句的判断顺序一致
WHERE 列名1=''AND 列名2=''

6.5.4、反向键索引

当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布

语法:

CREATE INDEX 名称 ON 表名(别名) REVERSE;

6.5.5、位图索引

位图索引适合创建在低基数列,位图索引不直接存储ROWID,而是存储字节位到ROWID的映射

低基数:某一字段的可能值只有有限个:性别,民族等

低基数查询时只能使用“=”

语法:

CREATE BITMAP INDEX 索引名 ON 表名(列名);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值