一、序列的概念
- 序列(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在被引用之前,必须先使用NEXTVALL来产生一个序列的值
- 可用语句 序列名.CURRVAL或序列名.NEXTVAL来访问序列
- 可以在下列情况下使用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
GREATE SEQUENCE student_seq START WITH 10000 INCREMENT BY 1;
- 使用上面创建好的序列生成student表中的sid列插入值
INSERT INTO student VALUES (student_seq.NEXTVAL,'Scott','Computer',11);
- 查看上面创建的序列的当前值
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; --不设定缓存 //注意:这里修改序列最大值的时候,只能修改成比原来大的数值
- 删除序列
- 语法:
DROP SEQUENCE 要删除的序列名称DROP SEQUENCE student_seq;
四、ROWID
- 是一个伪列,系统自动产生。
- ROWID能唯一标识每一条数据库行记录的物理地址,通过ROWID能够快速定位到一条行记录。
- ROWID的格式
- 例如:AAAHjXAAOAAAADaAAA
数据对象编号 文件编号 块编号 行编号
AAAHjX AAO AAAADa AAA- ROWID使用
SELECT * FROM emp WHERE ROWID = '真实存在的ROWID值';
五、索引概念
- 是对数据库表中一个或多个列的值进行排序的一种数据库对象
- 在数据库中,通过索引可以加速对表的查询速度
- 索引的类型
- 单列索引
索引建立在表中的某一列上- 复合索引
索引建立在表中的某几列的组合上
- 创建索引
- 自动创建:当有PRIMARY KEY或者UNIQUE约束时,数据库会自动创建索引
- 手动创建:用户使用创建索引的语法来进行创建
- 创建索引的语法
CREATE INDEX indexname
ON table(列名)
- 例子:在emp表的ename上创建索引
CREATE INDEX idx_emp_ename ON emp(ename);
- 适合创建索引的情况
- 表数据量很大
- 要查询的结果集在2% - 4%之间
- 经常用来做WHERE条件中的列或者多表连接的列
- 查询列的数据范围分布很广
- 查询列中包含大量的NULL值,因为空值不包含在索引中
- 不适合创建索引的情况
- 数据量很小的表
- 在查询中不常用来作为查询条件的列
- 频繁更新的表
- 索引列作为表达式的一部分被使用时,比如常查询的条件是SALARY*12,此时的SALARY列上创建索引是没有效果的
- 查询条件有单行函数时,用不上索引
- 索引的缺点
- 占用空间
- 降低DML的操作速度
- 删除索引
DROP INDEX 索引名称
删除索引后,索引中的数据及定义被删除,索引所占用的数据空间被释放,但表中的数据仍然存在
六、相关的数据字典
- USER_INDEXS:数据字典视图包含索引的名称及唯一性
- USER_IND_COLUMNS:数据字典视图中包含索引名称、表名以及列名
七、同义词
- 同义词的概念
- 同义词(SYNONYM)
是指向数据库对象(如:表、视图、序列、存储过程等)的数据指针。- 使用同义词的好处
1.可以简化对数据库对象的访问
2.方便对其他用户表的访问
3.简化过长的对象的名称
4.节省大量的数据库空间,对不同用户的操作同一张表没有多少差别
扩展数据库的使用范围,能够在不同的数据库用户之间实现无缝交互
5.同义词可以创建在不同一个数据库服务器上,通过网络实现连接
- 创建同义词
GREATE [ PUBLIC ] SYNONYM 同义词
FOR [schema.]对象名
- 同义词两种类型
- 私有(PRIVATE)
是在指定的方案中创建的,并且只允许拥有它的方案访问。- 共有(PUBLIC)
由PUBLIC方案所拥有,所有的数据库方案都能可以引用他们。
- 删除同义词
- 创建emp表的别名
GREATE SYNONYM s_emp FOR hr.emp;
- 删除同义词
DROP SYNONYM s_emp
注意:只有数据库管理员才拥有公有同义词的创建和删除权限