数据库对象和他们的用处
对象 | 描述 |
---|---|
表(Table) | 存储的基本单元,由行和列组成 |
视图(View) | 一个逻辑的数据表,数据来自一个或多个表 |
序列(Sequence) | 产生主健值 |
索引(Index) | 目的是提高查询的性能 |
同义词(Synonym) | 给出对象的别名 |
创建和使用视图
创建一个视图
创建一个视图的语句通常包含一个子查询,这个子查询中可以包含复杂的 SELECT 语法。
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
删除视图
删除一个视图不会丢失数据,因为视图的数据本来就是来自于数据库中的表。
DROP VIEW view;
例如:
SQL > DROP VIEW empvu10l;
视图的类型
视图分为简单视图和复杂视图。
特点 | 简单视图 | 复杂视图 |
---|---|---|
表的数量 | 一个 | 一个或多个 |
约束函数 | 没有 | 有 |
是否包含分组 | 不 | 是 |
可以对视图进行更新 | 是 | 不一定 |
对视图进行DML操作的规则
- 可以对简单视图进行DML操作
- 如果含有如下情况,则不能删除视图中的数据:
- 含有聚组函数
- 含有 GROUP BY 子句
- 含有 DISTINCT 关键字
- 含有ROWNUM这个伪列
- 如果一个视图包含下列情况,则不能修改视图中的数据:
- 包含不允许删除操作提到的任何一种情况
- 列是由表达式来进行定义的
- 含有ROWNUM伪列
- 如果有下列情况,则不能增加数据:
- 包含不允许更改操作提到的任何一种情况
- 在基表中包含有NOT NULL约束的列,然后该列并没有在视图中出现
创建、维护和使用序列
什么是序列
序列是数据库自动产生的唯一数字,是一个可以共享的数据库对象。它被典型的用于产生数据库表中的主健值。通过使用序列,能够节省应用程序的代码,而且当缓存在内存中时,能够提高存取的效率。
创建序列
如下定义一个可以自动产生序列值的序列:
(必须拥有权限,GRANT CREATE SEQUENCE TO scott)
CREATE SEQUENCE squence
[INCREMENT BY n]
[START WITH n]
[(MAXVALUE n | NOMAXVALUE)]
[(MINVALUE n | NOMINVALUE)]
[(CYCLE | NOCYCLE)]
[(CACHE n | NOCACHE)]
例如,可以创建一个名为 DEPT_DEPTNO的序列值,用于DEPT表,这里不设置 CYCLE 选项:
CREATE SEQUENCE dept_deptno
INCREMENT BY 1
START WITH 91
MAXVALUE 100
NOCACHE
NOCYCLE;
NEXTVAL和CURRVAL伪列
NEXTVAL 返回下一个可用的序列值,也就是说,每访问一次,它将产生一个唯一的新值,即使对不同的用户,该值也是唯一的。
CURRVAL 返回当前的序列值。在一个session中,只有当 NEXTVAL 被访问之后,CURRVAL伪列才能包含一个值。
序列的使用
如果向表中插入一个位于SAN DIEGO 名为“MARKETING”的部门:
INSERT INTO dept(deptno, dname, loc)
VALUES (dept_deptno.nextval, 'MARKETING', 'SAN DIEGO');
查看序列DEPT_DEPTNO的当前值:
SELECT dept_deptno.CURRVAL FROM dual;
序列的作用
将序列值存在内存中,可以使得这些值访问起来更快。
一般情况下,表中的序列值是连续的。但是如果发生下列情况,可能使得一个表中的序列值之间产生间隔,而不是连续的:
- 回滚操作的产生
- 系统崩溃
- 序列值同时也用于其他表
特别的,如果一个序列是以 NOCACHE 选项建立的,那么可以通过查询 USER_SEQUENCES 表来查看下一个可用的序列值(还可以查看其他状态),而不会使序列的当前值增加。
修改一个序列
可以更改序列的增量值、最大值、最小值、循环或者缓存选项。
SQL > ALTER SEQUENCE dept_deptno
INCREMENT BY 1
MAXVALUE 999999
NOCACHE
VOCYCLE
修改序列的建议
- 必须是序列的拥有者,或者拥有序列的修改权限
- 只有将来会用到的序列值会受到影响
- 只有重建序列,才能修改序列的START WITH 项
- 序列的修改可能会带来冲突,例如 MAXVALUE如果小于当前值就会发生冲突
删除一个序列
使用 DROP SEQUENCE 命令来删除一个数据字典中的序列。一旦序列被删除,那么该序列就可以被访问了。
SQL > DROP SEQUENCE dept_deptno;
创建和维护索引
什么是索引
索引是一个数据库模式对象,Oracle利用索引来加快对数据行的访问。在查询的过程中,依靠索引来快速定位数据,从而减少了磁盘I/O的次数。索引与使用他的表是相互独立的数据对象,Oracle服务器自动对索引进行维护和使用。索引是关键字和行id(即block的编号)之间建立的关联。
创建索引
有两种方式创建索引,自动和手动。
- 自动创建:当在创建表时,如果指定了 PRIMARY KEY 或者 UNIQUE约束,那么将自动创建索引。
- 手动创建:用户可以在某个列上建立非唯一的索引,以加快基于该列的查询。
什么时候创建索引
在以下情况下,可以为表创建索引:
- 欲创建索引的列在 WHERE 子句或者连接条件中频繁使用
- 该列所包含的不同值很多
- 该列包含大量的空值
- 表中的数据行数非常大,而且只有 2-4%数据行被查询出来
什么时候不必创建索引
索引不是万能的,以下情况不需要索引:
- 表是空的
- 列在查询条件中不经常使用
- 大多数基于该表的查询,所查询出的数据量远多于 2-4%行
- 表被频繁修改
确认索引创建结果
创建索引之后,可以通过两种方式确认创建结果:
- USER_INDEXES 数据字典视图包含用户创建的索引的名字和它的唯一性。
- USER_IND_COLUMNS 视图包含索引的名字、表名和列名。
SELECT ic.index_name, ic.column_name,
ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMP';
基于函数的索引
基于函数的索引也就是基于表达式的索引。索引表达式由表的列、常量、SQL函数或者用户自定义函数组成。
SQL > CREATE TABLE test (col1 NUMBER);
SQL > CREATE INDEX test_index on test(col1, col1 + 10)
SQL > SELECT col1+10 FROM test;
删除索引
要删除一个索引,必须是索引的拥有者,或者具有DROP ANY INDEX 权限。从数据字典中删除一个索引:
SQL > DROP INDEX index;
创建私有和公有的同义词
什么是同义词
同义词就是对象的另一个名字,通过创建一个同义词可以简化对数据库中对象的存取,例如缩短对象名字的长度。
CREATE [PUBLIC] SYNONYM synonym
FOR object;
创建和删除同义词
- 为视图DEPT_SUM_VU 创建一个简短的名字:
SQL > CREATE SYNONYM d_sum
FOR dept_sun_vu;
- 丢弃一个同义词
SQL > DROP SYNONYM d_sum;
网友评论