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

数据库对象和他们的用处

对象 描述
表(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;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容