Oracle-序列、索引、同义词

章节目标

  • 通过本章学习,学员应达到如下目标:
    • 理解序列、索引对象的作用及概念;
    • 掌握序列的创建及使用方法;
    • 掌握索引的创建及使用方法;
    • 掌握何时应该创建索引;
    • 了解同义词的概念;

本章内容

序列的概念

  • 序列(SEQUENCE)
    • 序列是按照一定规则能自动增加/减少数字的一种数据库对象。
    • 通常可以使用序列自动地生成主键值。

创建序列

  • 语法:
CREATE SEQUENCE [schema.] sequencename
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
  • sequencename:序列对象的名字

  • INCREMENT BY n:序列连续两个值之间的间隔n,默认为1。

  • START WITH n :序列起始值n,该项省略,起始值为1

  • MAXVALUE n :序列最大值;NOMAXVALUE :指定序列无最大值

  • MINVALUE n :序列最小值;NOMINVALUE :指定序列无最小值

  • CYCLE|NOCYCLE:表示序列在达到最大值或最小值之后是否继续产生序列值,NOCYLE表示不再产生,NOCYLE是默认选项。

  • CACHE n|NOCACHE:表示序列值被服务器预先分配并存储在内存中,NOCACHE表示不预先分配并存储,CACHE 20是默认选项

  • 例:创建序列test_seq,起始值为10,每次增长2,最大值100,最小值9,循环序列,每次缓存10

CREATE SEQUENCE test_seq
START WITH 10        --序列从10开始
INCREMENT BY 2     --序列每次增加2
MAXVALUE 100        --序列最大值100
MINVALUE 9          --序列最小值9
CYCLE             --序列循环,每次增加2,一直到100后回到9从新开始
CACHE 10;         --缓存中序列值个数为10

序列属性

  • NEXTVAL和CURRVAL伪列
    • CURRVAL:表示序列返回的当前值;
    • NEXTVAL:表示序列返回的下一个值;
    • CURRVAL在被引用之前,必须先使用NEXTVAL来产生一个序列值;
    • 可用语句 序列名.CURRVAL或 序列名.NEXTVAL来访问序列;
  • NEXTVAL和CURRVAL伪列
    • 您可以在下列情况使用NEXTVAL 和 CURRVAL:
      • SELECT 语句的SELECT列表中,但不包括子查询中的SELECT语句
      • INSERT 语句中的子查询SELECT列表中
      • INSERT 语句的VALUES子句中
      • UPDATE 语句的SET子句中
    • 下列情况不能使用 NEXTVAL 和 CURRVAL:
      • 在视图的SELECT列表中
      • 包含DISTINCT关键字的 SELECT语句中
      • 含有 GROUP BY, HAVING, ORDER BY子句的SELECT语句中
      • SELECT, DELETE, UPDATE 语句的子查询中
      • 含有 DEFAULT表达式的 CREATE TABLE、 ALTER TABLE 语句中

使用序列

  • 序列的使用
    • 创建序列student_seq:
CREATE SEQUENCE student_seq
START WITH 10000 
INCREMENT BY 1;
  • 使用序列student_seq生成student表中sid列插入值:
INSERT INTO student 
VALUES (student_seq.NEXTVAL, 'Scott', 'Computer Science', 11);
  • 查看student_seq序列当前值:
SELECT student_seq.CURRVAL FROM dual;

修序序列

  • 修改序列的语法如下:
ALTER  SEQUENCE  [schema.]sequencename
        [INCREMENT BY n]
        [MAXVALUE n | NOMAXVALUE]
        [MINVALUE n | NOMINVALUE]
        [CYCLE | NOCYCLE]
        [CACHE n | NOCACHE];
  • 修改序列的语法没有START WITH子句。

  • 修改序列

    • 正确修改
ALTER SEQUENCE test_seq
INCREMENT BY 4    ——序列每次增加4
MAXVALUE 1000     ——序列最大值1000
NOCACHE;         ——不设定缓存
  • 错误修改
ALTER SEQUENCE test_seq
INCREMENT BY 4    
MAXVALUE 100       ——最大值100小于已经分配的序列值200
NOCACHE; 

删除序列

  • 删除序列的语法如下:
DROP SEQUENCE [schema.]sequencename;
  • 例:删除序列student_seq
DROP SEQUENCE student_seq;

ROWID

  • ROWID
    • 是一个伪列,系统自动产生。
    • ROWID能唯一标示每一条数据库行记录的物理地址,通过 ROWID 能快速定位到一条行记录。
SELECT rowid,ename
FROM emp;
ROWID ENAME
AAAMfPAAEAAAAAgAAA SMITH
AAAMfPAAEAAAAAgAAB ALLEN
  • ROWID的格式
例: AAAHjXAAOAAAADaAAA
数据对象编号  文件编号    块编号       行编号
AAAHjX         AAO      AAAADa       AAA
ROWID ENAME
AAAHjXAAOAAAADaAAA SMITH
AAAHjXAAOAAAADaAAC ALLEN
  • ROWID的应用
    • 快速定位记录,使用ROWID检索及操作数据,效率最快
例:使用ROWID修改数据
    UPDATE emp
    SET    ename = ename || '*'
    WHERE ROWID = 'AAAMg6AAFAAAABUAAA';

索引概念

  • 索引( INDEX ):
    • 是对数据库表中一个或多个列的值进行排序的一种数据库对象。
    • 在数据库中,通过索引可以加速对表的查询速度;

索引类别

  • 单列索引:
    • 索引建立在表中的某一列上
  • 复合索引:
    • 索引建立在表中某几列的组合上

创建索引

  • 两种方式:

    • 自动创建: 当有 PRIMARY KEY 或者 UNIQUE 约束时,数据库会自动创建一个索引;
    • 手动创建: 用户使用创建索引语法来进行创建;
      • 创建索引语法:
CREATE INDEX indexname
ON table (column[, column]...);
  • 建议索引命名格式:idx_tablename_columnname

  • 例:在emp表的ename字段上创建索引.

CREATE INDEX    idx_emp_ename
ON  emp (ename);
  • 例:在emp表的deptno和job的组合上创建索引
CREATE INDEX    idx_emp_deptnojob
ON  emp (deptno,job);

测试索引

  • 创建测试环境表
CREATE TABLE e1 AS SELECT * FROM emp;
INSERT INTO e1 SELECT * FROM e1;--多次运行 
UPDATE e1 SET empno=ROWNUM;  --更新所有记录的empno,
                    --以使其数值唯一
commit;--提交
  • 测试无索引检索时间。
SELECT ename,sal FROM e1
WHERE empno=210000; 
  • 测试建索引后检索时间。
CREATE INDEX e1_id ON e1(empno); --创建索引
SELECT ename,sal FROM e1
WHERE empno=210000; --再次在有索引的情况下做测试

适合创建索引情况

  • 表数据量很大
  • 要查询的结果集在2%-4%左右
  • 经常用来做WHERE条件中的列或者多表连接的列
  • 查询列的数据范围分布很广
  • 查询列中包含大量的NULL值,因为空值不包含在索引中

不适合创建索引情况

  • 数据量很小的表
  • 在查询中不常用来作为查询条件的列
  • 频繁更新的表
  • 索引列作为表达式的一部分被使用时,比如常查询的条件是SALARY*12,此时在SALARY列上创建索引是没有效果的
  • 查询条件中有单行函数时,用不上索引

索引缺点

  • 占用空间;
  • 降低DML的操作速度;

删除索引

  • 删除索引的语法
DROP INDEX index;
  • 删除索引后,索引中的数据及定义被删除,索引所占的数据空间被释放,但表中的数据仍然存在。

相关数据字典

  • USER_INDEXES 数据字典视图包含索引的名称及其唯一性;
  • USER_IND_COLUMNS数据字典视图包含索引名称、表名以及列名;
SQL> SELECT ic.index_name, ic.column_name,
  2     ic.column_position col_pos,ix.uniqueness
  3  FROM   user_indexes ix, user_ind_columns ic
  4  WHERE  ic.index_name = ix.index_name
  5  AND        ic.table_name = 'EMP';

同义词

  • 同义词的概念
    • 同义词( SYNONYM )

      • 是指向数据库对象(如:表、视图、序列、存储过程等)的数据库指针。
    • 使用同义词好处:

      • 可以简化对数据库对象的访问;
      • 方便对其他用户表的访问;
      • 简化过长的对象名称;
      • 节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
      • 扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
      • 同义词可以创建在不同一个数据库服务器上,通过网络实现连接;
  • 创建同义词
    • 创建同义词的语法如下:
CREATE [PUBLIC] SYNONYM 同义词 
FOR  [schema.]对象名;
  • 同义词两种类型:

    • 私有(PRIVATE)。是在指定的方案中创建的,并且只允许拥有它的方案访问
    • 公有(PUBLIC)。由PUBLIC方案所拥有,所有的数据库方案都可以引用他们。
  • 删除同义词

    • 创建employees表的别名。
CREATE SYNONYM  s_emp
FOR  hr.employees;
  • 删除同义词。
DROP SYNONYM s_emp;
  • 只有数据库管理员才拥有公有同义词的创建和删除权限。

本章重点总结

  • 理解序列、索引对象的作用及概念;
  • 掌握序列的创建及使用方法;
  • 掌握索引的创建及使用方法;
  • 掌握何时应该创建索引;
  • 了解同义词的概念;

分割线


博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。

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

推荐阅读更多精彩内容