其他数据库对象

2
1

programming
1
Oracle SQL开发基础
2
2

programming
课程结构
内容

课时(H)

第一章 Oracle数据库基础

2.5

第二章 编写简单的SELECT语句

1.5

第三章 限制数据和对数据排序

2

第四章 单行函数

4

第五章 多表查询

4

第六章 分组函数

3

第七章 子查询

4

第八章 数据操作与事务控制

4

第九章 表和约束

4

第十章 其他数据库对象

4


2
3

programming
第十章 其他数据库对象

目标:

本章旨在向学员介绍:

1)视图

2)序列

3)索引

4)同义词

时间: 4学时
教学方法:讲授ppt+上机练习
2
4

programming
本章要点
.视图
.序列
.索引
.同义词



2
5

programming
第十章 其他数据库对象
其他数据库对象:

10.1视图

10.2分页

10.3序列

10.4索引

10.5同义词


2
6

programming
10.1.1视图的概念 1/3

.视图的概念
–视图是虚表。是一个命名的查询,用于改变基表数据的显
示,简化查询。视图的访问方式与表的访问方式相同。
–视图的好处:
.可以限制对基表数据的访问,只允许用户通过视图看到
表中的一部分数据
.可以使复杂的查询变的简单
.提供了数据的独立性,用户并不知道数据来自于何处
.提供了对相同数据的不同显示



2
7

programming
10.1.1视图的概念 2/3
.简单视图和复杂视图
–简单视图:只涉及到一个表,而且SELECT子句中不包含函
数表达式列(包括单行函数和分组函数)。
–复杂视图:涉及到一个或多个表,SELECT子句中包含函数
表达式列(单行函数或分组函数)。


 


2
8

programming
特征 简单视图 复杂视图

基表数量 一个 一个或多个

包含函数 没有 有

包含数据组 没有 有

通过视图实现DML操作 可以 不一定

最基本差别在DML操作上

10.1.1视图的概念 3/3

.简单视图和复杂视图



2
9

programming
10.1.2视图的管理 1/11
.创建视图


 


–在子查询中可以加入复杂的SELECT.
–子查询中能使用ORDER BY子句,如果想排序,可以在执行查询
视图时使用。


CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
2
10

programming
10.1.2视图的管理 2/11

.创建视图
–OR REPLACE:如果所创建的视图已经存在,Oracle会自动重建该试图
– FORCE:不管基表是否存在,Oracle都会创建该视图
– NOFORCE:只有基表都存在,Oracle才会创建该视图
– view:视图的名称
– alias:为视图所产生的列定义别名,别名的数量必须和视图所产生列的
数量相等
– subquery:一条完整的SELECT语句,在该语句中同样可以定义别名
– WITH CHECK OPTION:通过视图做DML操作时,必须要保证所插入
或修改或删除的数据行必须满足视图所定义的约束,也就是说插入或更
新后的结果必须仍然可以通过该视图查询得到 。
– constraint:CHECK OPTION中的约束名
– WITH READ ONLY:确保在该视图上不能进行任何DML操作,默认可
以通过视图执行DML操作。



2
11

programming
10.1.2视图的管理 3/11

.创建视图示例
–例10-3 查询50部门的员工的年薪的视图


CREATE OR REPLACE VIEW salvu50
AS
SELECT employee_id ID_NUMBER, last_name NAME,
salary*12 ANN_SALARY
FROM employees
WHERE department_id = 50;
DESC salvu50;
SELECT * FROM salvu50;
2
12

programming
10.1.2视图的管理 4/11

.通过视图执行DML操作
–创建一个测试用表EMP_DML
–创建视图v_emp1,是个简单视图。
–通过视图进行DML操作。


 


CREATE TABLE emp_dml AS

SELECT employee_id,last_name,salary

FROM employees

WHERE department_id=50;

CREATE OR REPLACE VIEW v_emp1 AS
SELECT employee_id,salary FROM emp_dml;
UPDATE v_emp1 SET salary=salary+100;
2
13

programming
10.1.2视图的管理 5/11
.不能通过视图删除记录的条件
–视图中包含分组函数
–视图中含有GROUP BY子句
–视图中含有DISTINCT关键字
–视图中包含伪列ROWNUM



2
14

programming
10.1.2视图的管理 6/11

.不能通过视图修改记录的条件
–视图中包含分组函数
–视图中含有GROUP BY子句
–视图中含有DISTINCT关键字
–视图中包含伪列ROWNUM
–视图中要修改的列包含表达式



2
15

programming
10.1.2视图的管理 7/11

.不能通过视图添加记录的条件
–视图中包含分组函数
–视图中含有GROUP BY子句
–视图中含有DISTINCT关键字
–视图中包含伪列ROWNUM
–视图中要修改的列包含表达式
–视图中没有表的NOT NULL列。



2
16

programming
10.1.2视图的管理 8/11
.WITH CHECK OPTION
–WITH CHECK OPTION实质是给视图加一个“CHECK”约
束,该CHECK约束的条件就是视图中的子查询的WHERE
条件,以后如果想通过该视图执行DML操作,不允许违反
该CHECK约束。



2
17

programming
10.1.2视图的管理 9/11
.WITH CHECK OPTION示例
–例10-6 WITH CHECK OPTION例子
–该约束的条件为视图中WHERE条件,即
“employee_id=141”,如视图v_emp3想执行DML操作,不
能把记录的employee_id字段值改成其他编号(只能是141),
如果违反了,执行出错,会出现错误提示。


CREATE OR REPLACE VIEW v_emp3
AS
SELECT employee_id,salary FROM emp_dml
WHERE employee_id=141
WITH CHECK OPTION CONSTRAINT v_emp3_ck;
2
18

programming
10.1.2视图的管理 10/11

.WITH READ ONLY
–WITH READ ONLY的视图是只读的,不允许通过该视图执
行DML语句。
–例10-7 WITH READ ONLY例子,创建一个视图v_emp4
–通过该视图进行更新操作


UPDATE v_emp4 SET salary=salary+100;
CREATE OR REPLACE VIEW v_emp4
AS
SELECT employee_id,salary FROM emp_dml
WITH READ ONLY;
2
19

programming
10.1.2视图的管理 11/11
.删除视图
–删除视图的语法


DROP VIEW view;
2
20

programming
10.1.3内联视图

.内联视图
–内联视图(Inline View),是一个在SQL语句内可以使用的
子查询的别名。是一个命名的SQL语句,但不是真正的数
据库的视图对象。最常见的内联视图的例子就是主查询中
的FROM子句中,包含的是一个命名的子查询。
–例10-8 内联视图的例子


SELECT last_name,department_name
FROM DEPARTMENTS a,
(SELECT last_name,department_id FROM EMPLOYEES) b
WHERE a.department_id=b.department_id;
2
21

programming
第十章 其他数据库对象
其他数据库对象:

10.1视图

10.2分页

10.3序列

10.4索引

10.5同义词


2
22

programming
10.2.1ROWNUM及其特性 1/2
.ROWNUM介绍
–ROWNUM是一个伪列。伪列是使用上类似于表中的列,
而实际并没有存储在表中的特殊对象。
–ROWNUM的功能是在每次查询时,返回结果集的顺序数。
–这个顺序数是在记录输出时才一步一步产生的。第一行
显示为1,第二行为2,以此类推。


 

例:生成员工表记录序号

SELECT ROWNUM,

 employee_id,

 first_name,

 hire_date

FROM employees


2
23

programming
10.2.1ROWNUM及其特性 2/2
.ROWNUM使用的注意点:
–1.ROWNUM和ORDER BY一起使用序号会混乱
–2.对ROWNUM只能执行<、<=运算,不能执行>、>=或
一个区间运算Between..And等 。


 

例1.ROWNUM和ORDERBY
一起使用的结果
SELECT ROWNUM,
employee_id,
first_name,
hire_date
FROM employees
ORDER BY first_name
2
24

programming
10.2.2TOP-N分页 1/2

.分页(Top-N)
–Top-N分页查询主要是实现查找表中最大或最小的N条记
录功能。
–Top-N分析语法:


SELECT [列名], ROWNUM
FROM (SELECT [列名]
FROM 表名
ORDER BY Top-N操作的列)
WHERE ROWNUM <= N;
2
25

programming
10.2.2TOP-N分页 2/2

.分页(Top-N)
–按照员工工资从高到低的分页SQL语句


SELECT *
FROM (SELECT *
FROM (SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC
)
WHERE ROWNUM <= 每页的记录数 * 目标页数
ORDER BY SALARY
)
WHERE ROWNUM <= 每页的记录数
ORDER BY SALARY DESC;
2
26

programming
10.2.3ROWNUM分页 1/2
.分页(ROWNUM)
–ROWNUM主要是利用ROWNUM生成的序号进行分页查
询。
–语法分析:
.利用列别名将ROWNUM列转化为实际列


SELECT [列名], ROWNUM as RN
FROM (SELECT [列名]
FROM 表名
ORDER BY Top-N操作的列);
2
27

programming
10.2.3ROWNUM分页 2/2
.分页(ROWNUM)
–按照员工工资从高到低的分页SQL语句


 

SELECT *
FROM (SELECT ROWNUM AS rn,
t.*
FROM (SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC
) t
)
WHERE rn BETWEEN 每页的记录数 * (目标页数-1) + 1 AND 每页
的记录数 * 目标页数 ;
2
28

programming
第十章 其他数据库对象
其他数据库对象:

10.1视图

10.2分页

10.3序列

10.4索引

10.5同义词


2
29

programming
10.3.1序列的概念
.序列是一种用于产生唯一数字列值的数据库对象。一般使用序
列自动地生成主码值或唯一键值。序列可以是升序或降序。
.序列特点:
–可以为表中的记录自动产生唯一序列值。
–由用户创建并且可被多个用户共享。
–典型应用是生成主键值,用于标识记录的唯一性。
–允许同时生成多个序列号,而每一个序列号是唯一的。
–可替代应用程序中使用到的序列号。
–使用缓存加速序列的访问速度。



2
30

programming
10.3.2创建序列
.创建序列的语法:


 

.创建序列,必须有CREATE SEQUENCE或CREATE ANY
SEQUENCE权限。
.序列被创建后,可以通过查询数据字典视图
USER_SEQUENCES查看序列信息。


CREATE SEQUENCE [schema.]序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
2
31

programming
10.3.2创建序列
–语法中:
– sequence 序列产生器的名称
– INCREMENT BY n 指定序列值之间的间隔n,如果省略该
项间隔为1
– START WITH n 指定起始序列值n,如果该项省略起始
值为1
– MAXVALUE n 指定最大序列值
– NOMAXVALUE 指定最大序列值为10的27次方,而降
序的最大值为-1,这是一默认选项
– MINVALUE n 指定最小序列值
– NOMINVALUE 指定升序最小序列值为1,而降序最小
序列值为负10的26次方,这是一默认选项
– CYCLE | NOCYCLE 指定序列值在达到最大值或最小值之后
继续产生序列值,NOCYLE表示不再产生,NOCYLE是默认选项。
– CACHE n | NOCACHE 指定序列值被Oracle服务器预先分配并
存储在内存中,NOCACHE表示不预先分配并存储,CACHE 20
是默认选项



2
32

programming
10.3.2创建序列
.当全部缺省时,则该序列为上升序列,由1开始,增量为1,
没有上限,缓存中序列值个数为20。
.INCREMENT BY n: n可为正的或负的整数,但不可为0。
默认值为1。
.START WITH n:指定生成的第一个序列号,默认为1。对
于升序,默认为序列的最小值。对于降序,默认为序列的
最大值。
.MAXVALUE n:指定n为序列可生成的最大值。
.NOMAXVALUE:为默认情况。指定升序最大值为1027,指
定降序指定最大值为-1。



2
33

programming
10.3.2创建序列
.MINVALUE n:指定n为序列的最小值。
.NOMINVALUE:为默认情况。指定升序默认最小值为1。指定
降序默认最小值为-1026。
.CYCLE:指定序列使用循环。即序列达到了最大值,则返回
最小值重新开始。默认为NOCYCLE。
.CACHE n:定义n个序列值保存在缓存中,默认值为20个。



2
34

programming
10.3.2创建序列
.例10-12 创建序列test_seq。


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
2
35

programming
10.3.3NEXTVAL和CURRVAL伪列
.可用语句sequence_name.CURRVAL和
sequence_name.NEXTVAL来访问序列。
–CURRVAL当前序列正被分配的序列值。
–NEXTVAL在序列中增加新值并返回此值。
–CURRVAL和NEXTVAL都返回NUMBER值。
–NEXTVAL 应在 CURRVAL 之前指定 ,二
者应同时有效



2
36

programming
10.3.3NEXTVAL和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 语句中



2
37

programming
10.3.3NEXTVAL和CURRVAL伪列
.创建序列student_seq:
.使用序列student_seq生成student表中sid列插入值:
.查看student_seq序列当前值:


 

SELECT student_seq.CURRVAL FROM dual;
INSERT INTO student
VALUES (student_seq.NEXTVAL, 'Scott', 'Computer Science', 11);
CREATE SEQUENCE student_seq
START WITH 10000
INCREMENT BY 1;
2
38

programming
10.3.4修改序列
.修改序列的语法如下:
.必须是序列的所有者,或者有ALTER ANY SEQUENCE 权限才
能修改序列。
.修改序列的语法除没有START WITH子句外。


ALTER SEQUENCE [schema.]序列名
[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
2
39

programming
10.3.4修改序列
.正确修改
.错误修改


ALTER SEQUENCE test_seq
INCREMENT BY 4
MAXVALUE 100 ——最大值100小于已经分配的序列值200
NOCACHE;
ALTER SEQUENCE test_seq
INCREMENT BY 4 ——序列每次增加4
MAXVALUE 1000 ——序列最大值1000
NOCACHE; ——不设定缓存
2
40

programming
10.3.5删除序列
.对序列的删除必须是序列的所有者或者具有DROP ANY
SEQUENCE权限的用户才可以完成。
.删除序列的语法如下:
.例10-15 删除序列student_seq删除序列student_seq


 

DROP SEQUENCE student_seq;
DROP SEQUENCE [schema.] 序列名;
2
41

programming
第十章 其他数据库对象
其他数据库对象:

10.1视图

10.2分页

10.3序列

10.4索引

10.5同义词


2
42

programming
10.4.1索引的概念
.索引是:
–方案(schema)中的一个数据库对象
–在 Oracle数据库中用来加速对表的查询速度
–通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
–与表独立存放,但需要依附于表,是在表的基础上创建的
–由 Oracle数据库自动维护



2
43

programming
10.4.1索引的概念
2
44

programming
10.4.2创建索引
.创建索引有两种方式:自动或者手动
.自动: 当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条
件时,Oracle数据库自动创建一个对应的唯一索引.
.手动: 用户可以创建索引以加速查询,在需要创建索引的字段
上创建需要的索引。



2
45

programming
10.4.2创建索引
.在一列或者多列上创建索引.
.下面的索引将会提高对EMPLOYEES表基于 LAST_NAME 字
段的查询速度.


CREATE INDEX indexname
ON table (column[, column]...);
CREATE INDEX emp_last_name_idx
ON employees(last_name);
Index created.
2
46

programming
10.4.3测试索引
.创建测试环境表。
.测试无索引检索时间。


CREATE TABLE e1 AS SELECT * FROM employees;
INSERT INTO e1 SELECT * FROM e1;--多次运行
UPDATE e1 SET employee_id=ROWNUM; --更新所有记录的
employee_id,以使其数值唯一
commit;--提交
set timing on; --设置环境变量timing
SELECT last_name,salary FROM e1
WHERE employee_id=210000; --没有索引的情况下做测试
已用时间: 00: 00: 06.05 –没有索引的时候用时6秒
2
47

programming
10.4.3测试索引
.测试建索引后检索时间。


CREATE INDEX e1_id ON e1(employee_id); --创建索引
SELECT last_name,salary FROM e1
WHERE employee_id=210000; --再次在有索引的情况下做测试
已用时间: 00: 00: 00.00 –测试结果,几乎没有消耗什么时间
set timing off; --取消时间统计
2
48

programming
10.4.4索引分析
.适合创建索引情况
–查询列的数据范围很广泛
–查询列中包含大量的NULL值
–WHERE条件中的列或者多表连接的列适合创建索引
–欲查询的表数据量很大,而且大多数的查询得到结果集的
数量占总记录量的2%~4%



2
49

programming
10.4.4索引分析
.不适合创建索引的情况
–很小数据量的表
–在查询中不常用来作为查询条件的列
–查询最终得到的结果集很大
–频繁更新的表(索引对于DML操作是有部分负面影响的)
–索引列作为表达式的一部分被使用时(比如常查询的条件
是SALARY*12,此时在SALARY列上创建索引是没有效果
的)



2
50

programming
10.4.5删除索引
.删除索引的语法
.删除索引后,索引中的数据及定义被删除,索引所占的数据空
间被释放,但表中的数据仍然存在。
.常用与索引相关的数据字典视图有:
–USER_INDEXES:用户的索引对象的定义,包含索引的名
字和索引的一些相关属性(比如唯一性等)
–USER_IND_COLUMNS:用户索引对象的列的定义信息,
会列出索引名字,表名字,和列的名字等。


DROP INDEX index;
2
51

programming
第十章 其他数据库对象
其他数据库对象:

10.1视图

10.2分页

10.3序列

10.4索引

10.5同义词


2
52

programming
10.5.1同义词的概念
.同义词(Synonyms)是指向数据库对象(如:表、视图、序
列、存储过程等)的数据库指针。
.使用同义词好处:
–可以简化对数据库对象的访问。
–方便对其他用户表的访问。
–简化过长的对象名称。
–节省大量的数据库空间,对不同用户的操作同一张表没有
多少差别。
–扩展的数据库的使用范围,能够在不同的数据库用户之间
实现无缝交互
–同义词可以创建在不同一个数据库服务器上,通过网络实
现连接。



2
53

programming
10.5.2创建同义词
.创建同义词的语法如下:


 

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


CREATE [PUBLIC] SYNONYM 同义词
FOR [schema.]对象名;
2
54

programming
10.5.3删除同义词
.创建employees表的别名。
.删除同义词。
.只有数据库管理员才拥有公有同义词的创建和删除权限。


CREATE SYNONYM s_emp
FOR hr.employees;
DROP SYNONYM s_emp;
2
55

programming
本章小结
.视图的概念及应用
.序列的概念及应用
.索引的概念及应用
.同义词的概念及应用。



2
56

programming
练习
.1.试创建视图v_emp_80,包含80号部门的员工编号,姓名,
年薪列。
.2.从视图v_emp_80中查询年薪在12万元以上的员工的信息。
.3.创建试图v_dml,包含部门编号大于100号的部门的信息。
.4.从视图v_dml插入如下记录:部门编号360,部门名称AAA,管理
者编号101,区域编号1700.



2
57

programming
练习(续)
.5.从视图v_dml中删除300号以上的部门信息。
.6.给表employees创建同义词em。
.7.使用同义词em统计各部门员工的人数。



2
58

programming
谢谢



猜你喜欢

转载自blog.csdn.net/jiangjiewudi/article/details/9618059