目标
通过本章学习,您将可以:
l 描述视图
l 创建和修改视图的定义,删除视图
l 从视图中查询数据
l 通过视图插入, 修改和删除数据
l 使用“Top-N” 分析
l 创建, 维护, 和使用序列
l 创建和维护索引
l 创建同义词
视图描述
l 视图是一种虚表.
l 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
l 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
l 视图向用户提供基表数据的另一种表现形式
为什么使用视图
l 控制数据访问
l 简化查询
l 避免重复访问相同的数据
创建视图
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;
修改视图
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS SELECT employee_id, first_name || ' ' || last_name,
salary, department_id
FROM employees
WHERE department_id = 80;
屏蔽 DML 操作
l 可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
l 任何 DML 操作都会返回一个Oracle server 错误
CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id
FROM employees
WHERE department_id = 10
WITH READ ONLY;
Top-N 分析
查询工资最高的三名员工:
SELECT ROWNUM as RANK, last_name, salary
FROM (SELECT last_name,salary FROM employees
ORDER BY salary DESC)
WHERE ROWNUM <= 3;
rownum“伪列”,数据表本身并没有这样的列,是oracle数据库为每个数据表“加上的”列,可以标识行号,默认情况下rownum按主索引来排序,若没有主索引则自然排序。
注意:对rownum只能使用<或<=,,而用=,>,>=都将不能返回任何数据。
使用rownum进行分页
select * from (
select rownum rn,e.*,from employees e
)
where rn>=(pageNum-1)*pageSize+1 and rn<=pageNum*pageSize
什么是序列?
序列: 可供多个用户用来产生唯一数值的数据库对象
l 自动提供唯一的数值
l 共享对象
l 主要用于提供主键值
l 将序列值装入内存可以提高访问效率
定义序列:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
比如:
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
查询序列
l 查询数据字典视图 USER_SEQUENCES 获取序列定义信息
SELECT sequence_name, min_value, max_value,
increment_by, last_number
FROM user_sequences;
NEXTVAL 和 CURRVAL 伪列
l NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
l CURRVAL 中存放序列的当前值
l NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效
select dept_deptid_seq.nextval from dual;
SELECT dept_deptid_seq.CURRVAL
FROM dual;
序列应用:
INSERT INTO departments(department_id,
department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL, //自增列
'Support', 2500);
修改序列
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
删除序列
DROP SEQUENCE dept_deptid_seq;
索引
l 一种独立于表的模式对象, 可以存储在与表不同的磁盘或表空间中
l 索引被删除或损坏, 不会对表产生影响, 其影响的只是查询的速度
l 索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引. 用户不用在查询语句中指定使用哪个索引
l 在删除一个表时, 所有基于该表的索引会自动被删除
l 通过指针加速 Oracle 服务器的查询速度
l 通过快速定位数据的方法,减少磁盘 I/O
创建索引
CREATE INDEX emp_last_name_idx
ON employees(last_name);
什么时候创建索引
以下情况可以创建索引:
l 列中数据值分布范围很广
l 列经常在 WHERE 子句或连接条件中出现
l 表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%
什么时候不要创建索引
下列情况不要创建索引:
l 表很小
l 列不经常作为连接条件或出现在WHERE子句中
l 查询的数据大于2%到4%
l 表经常更新
删除索引
DROP INDEX upper_last_name_idx;
同义词
使用同义词访问相同的对象:
l 方便访问其它用户的对象
l 缩短对象名字的长度
创建和删除同义词
CREATE SYNONYM d_sum
FOR dept_sum_vu;
DROP SYNONYM d_sum;