美文网首页程序园
Oracle SQL 学习笔记10- Oracle数据库中的对象

Oracle SQL 学习笔记10- Oracle数据库中的对象

作者: 赵阳_c149 | 来源:发表于2020-02-05 17:52 被阅读0次

数据库对象和他们的用处

对象 描述
表(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操作的规则

  1. 可以对简单视图进行DML操作
  2. 如果含有如下情况,则不能删除视图中的数据:
  • 含有聚组函数
  • 含有 GROUP BY 子句
  • 含有 DISTINCT 关键字
  • 含有ROWNUM这个伪列
  1. 如果一个视图包含下列情况,则不能修改视图中的数据:
  • 包含不允许删除操作提到的任何一种情况
  • 列是由表达式来进行定义的
  • 含有ROWNUM伪列
  1. 如果有下列情况,则不能增加数据:
  • 包含不允许更改操作提到的任何一种情况
  • 在基表中包含有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;

序列的作用

将序列值存在内存中,可以使得这些值访问起来更快。
一般情况下,表中的序列值是连续的。但是如果发生下列情况,可能使得一个表中的序列值之间产生间隔,而不是连续的:

  1. 回滚操作的产生
  2. 系统崩溃
  3. 序列值同时也用于其他表
    特别的,如果一个序列是以 NOCACHE 选项建立的,那么可以通过查询 USER_SEQUENCES 表来查看下一个可用的序列值(还可以查看其他状态),而不会使序列的当前值增加。

修改一个序列

可以更改序列的增量值、最大值、最小值、循环或者缓存选项。

SQL > ALTER SEQUENCE dept_deptno
  INCREMENT BY 1
  MAXVALUE 999999
  NOCACHE
  VOCYCLE

修改序列的建议

  1. 必须是序列的拥有者,或者拥有序列的修改权限
  2. 只有将来会用到的序列值会受到影响
  3. 只有重建序列,才能修改序列的START WITH 项
  4. 序列的修改可能会带来冲突,例如 MAXVALUE如果小于当前值就会发生冲突

删除一个序列

使用 DROP SEQUENCE 命令来删除一个数据字典中的序列。一旦序列被删除,那么该序列就可以被访问了。

SQL > DROP SEQUENCE dept_deptno;

创建和维护索引

什么是索引

索引是一个数据库模式对象,Oracle利用索引来加快对数据行的访问。在查询的过程中,依靠索引来快速定位数据,从而减少了磁盘I/O的次数。索引与使用他的表是相互独立的数据对象,Oracle服务器自动对索引进行维护和使用。索引是关键字和行id(即block的编号)之间建立的关联。

创建索引

有两种方式创建索引,自动和手动。

  • 自动创建:当在创建表时,如果指定了 PRIMARY KEY 或者 UNIQUE约束,那么将自动创建索引。
  • 手动创建:用户可以在某个列上建立非唯一的索引,以加快基于该列的查询。

什么时候创建索引

在以下情况下,可以为表创建索引:

  1. 欲创建索引的列在 WHERE 子句或者连接条件中频繁使用
  2. 该列所包含的不同值很多
  3. 该列包含大量的空值
  4. 表中的数据行数非常大,而且只有 2-4%数据行被查询出来

什么时候不必创建索引

索引不是万能的,以下情况不需要索引:

  1. 表是空的
  2. 列在查询条件中不经常使用
  3. 大多数基于该表的查询,所查询出的数据量远多于 2-4%行
  4. 表被频繁修改

确认索引创建结果

创建索引之后,可以通过两种方式确认创建结果:

  1. USER_INDEXES 数据字典视图包含用户创建的索引的名字和它的唯一性。
  2. 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;

相关文章

网友评论

    本文标题:Oracle SQL 学习笔记10- Oracle数据库中的对象

    本文链接:https://www.haomeiwen.com/subject/pkbsxhtx.html