Oracle 11g 第十二章知识点总结——其他数据库对象
知识点预览
复习
其他数据库对象
复习
--序列
Create sequence seq_name
--综合练习
--社区网站 人人网
--站内信系统
--会员
--member
--id主键自动增长
--namenot null
--password
--gender默认值 0, 1
--introduction
--emailunique
--logindate date
create table member
(
idnumber(6) primary key,
namevarchar2(20) not null,
passwordvarchar2(16) default('123456'),
genderchar(1) check(gender in ('0', '1')),
introductionvarchar2(1000) null,
emailvarchar2(20) not null unique,
logindatedate
);
--gender:0女 1男
insert into membervalues(seq_wgb_member.nextval, '温国兵', 'wgb', '1', 'I am unique!','wgbno27@163.com', sysdate);
insert into membervalues(seq_wgb_member.nextval, '姜国彦', 'jgy', '1', '嘿嘿', '123465@163.com', sysdate);
insert into member values(seq_wgb_member.nextval,'熊子睿', 'xzr', '1', '哈哈', '123447@163.com', sysdate);
insert into membervalues(seq_wgb_member.nextval, '李智鹏', 'lzp', '1', '呵呵', '124556@163.com', sysdate);
insert into membervalues(seq_wgb_member.nextval, '朱家敏', 'zjm', '1', '哇哇', '123232@163.com', sysdate);
--信
--message
--id主键自动增长
--titlenot null
--contentnot null
--to_member外键
--from_member外键
--face_id外键
--commons_id外键
--status记录状态 当前这封信有没有读到/有没有被回复 (1 2 3) case decode not null
--status0 inbox 1 outbox 2 当前这封信被读到 3 当前这封信没被读到 4 被回复 5 没有被回复
create table message
(
idnumber(6) primary key,
titlevarchar2(30) not null,
contentvarchar2(1000) not null,
to_membernumber(6),
from_membernumber(6),
face_idnumber(6),
commons_idnumber(6),
statusnumber(2),
constraintwgb_message_toMember_FK foreign key(to_member) references member(id),
constraintwgb_message_fromMember_FK foreign key(from_member) references member(id),
constraintwgb_message_faceId_FK foreign key(face_id) references faces(id),
constraintwgb_message_commonID_FK foreign key(commons_id) references commons(id)
);
insert into messagevalues(seq_wgb_message.nextval, '欢迎入学', '今天是开学的第一天 加油', 3, 2, 11, 5, 0);
insert into messagevalues(seq_wgb_message.nextval, '同学会', '今天是同学会 好开心', 5, 3, 4, 8, 1);
insert into messagevalues(seq_wgb_message.nextval, '饭卡掉了', '悲剧的一天', 4, 6, 10, 2, 0);
insert into messagevalues(seq_wgb_message.nextval, '打篮球', '强身健体', 6, 4, 11, 5, 1);
--表情
--faces
--id主键自动增长
--face文字 微笑 哭 --not null
create table faces
(
idnumber(6) primary key,
facevarchar2(10) not null
);
insert into facesvalues(seq_wgb_faces.nextval, '微笑');
insert into facesvalues(seq_wgb_faces.nextval, '哭');
insert into facesvalues(seq_wgb_faces.nextval, '大笑');
insert into facesvalues(seq_wgb_faces.nextval, '憨笑');
insert into facesvalues(seq_wgb_faces.nextval, '抓狂');
insert into facesvalues(seq_wgb_faces.nextval, '大兵');
insert into facesvalues(seq_wgb_faces.nextval, '酷');
insert into facesvalues(seq_wgb_faces.nextval, '悲伤');
insert into facesvalues(seq_wgb_faces.nextval, '难过');
insert into faces values(seq_wgb_faces.nextval,'开心');
--常用语
--commons
--id主键自动增长
--word文字 你好 我好 --not null
create table commons
(
idnumber(6) primary key,
wordvarchar2(40) not null
);
insert into commonsvalues(seq_wgb_commons.nextval, '你好');
insert into commons values(seq_wgb_commons.nextval,'我好');
insert into commonsvalues(seq_wgb_commons.nextval, '大家好');
insert into commonsvalues(seq_wgb_commons.nextval, '欢迎');
insert into commonsvalues(seq_wgb_commons.nextval, '再见');
insert into commonsvalues(seq_wgb_commons.nextval, '保重');
insert into commonsvalues(seq_wgb_commons.nextval, '注意身体');
--插入数据
--查询:
--某个用户登录后,查看自己的站内信 inbox outbox 内容 表情 常用语
--要求:1.inbox:显示发件人的名字、title、status、content、face、word
--status0 inbox 1 outbox 2 当前这封信被读到 3 当前这封信没被读到 4 被回复 5 没有被回复
selectt3.name as "发件人",mes.title as "信息标题",mes.content as "信息内容" ,t1.face as "表情",t2.word as "常用语",
casemes.status when 0 then '收件箱'
when 1 then '发件箱'
when 2 then '当前这封信被读到'
when 3 then '当前这封信没被读到'
when 4 then '被回复'
when 5 then '没有被回复'
end"状态"
frommessage mes, member mem,
(
selectid,face
fromfaces
)t1,
(
selectid,word
fromcommons
)t2,
(
selectid, name
frommember
)t3
wheremes.from_member = mem.id
andt3.id = mes.from_member
andmes.face_id = t1.id
andmes.commons_id = t2.id
andmes.status = 0;
--2.outbox:显示收件人的名字、title、status、content、face、word
selectt3.name as "收件人",mes.title as "信息标题",mes.content as "信息内容",t1.face as "表情",t2.word as "常用语",
casemes.status when 0 then '收件箱'
when 1 then '发件箱'
when 2 then '当前这封信被读到'
when 3 then '当前这封信没被读到'
when 4 then '被回复'
when 5 then '没有被回复'
end"状态"
frommessage mes, member mem,
(
selectid,face
fromfaces
)t1,
(
selectid,word
fromcommons
)t2,
(
selectid, name
frommember
)t3
wheremes.to_member = mem.id
andt3.id = mes.to_member
andmes.face_id = t1.id
andmes.commons_id = t2.id
andmes.status = 1;
create sequence seq_wgb_member;
create sequence seq_wgb_message;
create sequence seq_wgb_faces;
create sequenceseq_wgb_commons;
其他数据库对象
1. 常见数据库对象
2. 什么是序列?
序列:
自动提供唯一的数值
共享对象
主要用于提供主键值
代替应用代码
将序列值装入内存可以提高访问效率
3. CREATE SEQUENCE 语句
定义序列:
CREATESEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
4. 创建序列
a) 创建序列 DEPT_DEPTID_SEQ为表 DEPARTMENTS 提供主键
b) 不使用 CYCLE 选项
CREATE SEQUENCEdept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
Sequence created.
5. 查询序列
a) 查询数据字典视图 USER_SEQUENCES获取序列定义信息
SELECT sequence_name, min_value, max_value,
increment_by, last_number
FROM user_sequences;
b) 如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值
6. NEXTVAL 和 CURRVAL 伪列
a) NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
b) CURRVAL 中存放序列的当前值
c) NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效
7. 序列应用举例
INSERT INTO departments(department_id,
department_name,location_id)
VALUES (dept_deptid_seq.NEXTVAL,
'Support', 2500);
1 row created.
序列 DEPT_DEPTID_SEQ 的当前值
SELECT dept_deptid_seq.CURRVAL
FROM dual;
8. 使用序列
a) 将序列值装入内存可提高访问效率
b) 序列在下列情况下出现裂缝:
i. 回滚
ii. 系统异常
iii. 多个表同时使用同一序列
c) 如果不讲序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值
9. 修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存
ALTER SEQUENCEdept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
Sequence altered.
10. 修改序列的注意事项
a) 必须是序列的拥有者或对序列有 ALTER 权限
b) 只有将来的序列值会被改变
c) 改变序列的初始值只能通过删除序列之后重建序列的方法实现
d) 其它的一些限制
11. 删除序列
a) 使用DROP SEQUENCE 语句删除序列
b) 删除之后,序列不能再次被引用
DROP SEQUENCEdept_deptid_seq;
Sequence dropped.
12. 索引
索引:
一种数据库对象
通过指针加速 Oracle 服务器的查询速度
通过快速定位数据的方法,减少磁盘 I/O
索引与表相互独立
Oracle 服务器自动使用和维护索引
13. 创建索引
a) 自动创建: 在定义 PRIMARYKEY 或 UNIQUE 约束后系统自动在相应的列上创建唯一性索引
b) 手动创建: 用户可以在其它列上创建非唯一的索引,以加速查询
c) 在一个或多个列上创建索引
CREATE INDEX index
ON table(column[, column]...);
d) 在表 EMPLOYEES的列 LAST_NAME 上创建索引
CREATE INDEX emp_last_name_idx
ON employees(last_name);
Index created.
14. 什么时候创建索引
以下情况可以创建索引:
列中数据值分布范围很广
列中包含大量空值
列经常在 WHERE 子句或连接条件中出现
表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%
15. 什么时候不要创建索引
下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
查询的数据大于2%到4%
表经常更新
加索引的列包含在表达式中
16. 查询索引
可以使用数据字典视图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 = 'EMPLOYEES';
17. 基于函数的索引
a) 基于函数的索引是一个基于表达式的索引
b) 索引表达式由列, 常量, SQL 函数和用户自定义的函数
CREATE INDEXupper_dept_name_idx
ONdepartments(UPPER(department_name));
Index created.
SELECT *
FROM departments
WHERE UPPER(department_name) = 'SALES';
18. 删除索引
a) 使用DROP INDEX 命令删除索引
DROP INDEX index;
b) 删除索引UPPER_LAST_NAME_IDX
DROP INDEXupper_last_name_idx;
Index dropped.
c) 只有索引的拥有者或拥有DROP ANY INDEX权限的用户才可以删除索引
19. 同义词
使用同义词访问相同的对象:
方便访问其它用户的对象
缩短对象名字的长度
CREATE [PUBLIC] SYNONYM synonym
FOR object;
20. 创建和删除同义词
a) 为视图DEPT_SUM_VU 创建同义词
CREATESYNONYM d_sum
FOR dept_sum_vu;
Synonym Created.
b) 删除同义词
DROP SYNONYMd_sum;
Synonym dropped.