Oracle-DDL 2- 视图&索引

DDL-数据定义语句:

 二、视图

–视图(view),本身不保存数据,保存的是一个查询语句
–对视图的操作等同于对查询语句中源数据的操作
–视图占用存储空间较小,可以快速的对特定数据进行访问和操作
–视图主要用于针对相同的数据,创建不同的视图来区分访问和操作的权限
–创建适当的视图可以简化查询语句
–创建视图需要相应的权限

/*
create 【or replace】 view 视图名称
【(列名1,列名2,……)】
as
select ……
【with read only】;

or replace 如果不写,创建的视图名称已经存在会报错
如果写上 or replace 则同名的视图会被替换

with read only 表示该视图只能查看,不能修改数据
*/

–使用管理员给scott用户赋予创建视图的权限
GRANT CREATE VIEW TO scott;

1.区分权限
–emp表针对不同的员工和职位,能够访问和操作的数据不一样
–boss和hr 可以查看和修改所有员工的信息,直接使用emp
–部门经理可以查看和修改本部门的员工信息
–普通员工只能查看自己的信息,不能修改

–针对部门经理和普通员工创建不同的视图进行区别

–部门经理的视图
CREATE VIEW v_dept20
AS
SELECT * FROM emp
WHERE deptno = 20;

–对视图的操作与对表的操作一致
SELECT * FROM v_dept20;

–对视图中数据的修改等同于对源表中数据的修改
UPDATE v_dept20
SET sal = 1500
WHERE ename = ‘SMITH‘;

SELECT * FROM emp;

–普通员工的视图
CREATE VIEW v_7369
AS
SELECT empno,ename,job,sal,deptno FROM emp
WHERE empno = 7369
WITH READ ONLY;

SELECT * FROM v_7369;

UPDATE v_7369
SET sal = 2000;

 

2.简化查询语句

–查询research部门的员工人数
1)子查询
SELECT COUNT(*) FROM emp
WHERE deptno =
(SELECT deptno FROM dept WHERE dname = ‘RESEARCH‘);

2)多表查询
SELECT COUNT(e.empno)
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND d.dname = ‘RESEARCH‘;

3)视图
–如果有些表之间的数据关系很密切,经常互相作为条件进行查询
–可以提前准备好相应的视图,从视图中查询数据
CREATE VIEW emp_dept
AS
SELECT e.*,d.deptno dno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno(+) = d.deptno;

SELECT * FROM emp_dept;

–查询research部门的员工人数
SELECT COUNT(*) FROM emp_dept
WHERE dname = ‘RESEARCH‘;

三、索引

索引(index)给表中的某列数据创建索引,可以提高查询效率
–表中的每行数据所存储的位置都有一个rowid
SELECT ename,ROWID FROM emp;
–索引将数据和rowid的关系对应起来,直接通过rowid访问数据的存储位置
–经常作为查询条件的列创建索引提高查询效率

1.B树索引
create index 索引名称 on 表名(列名);
CREATE INDEX index1 ON emp(ename);

–确认索引的创建
SELECT * FROM user_indexes;

索引不需要使用,当查询语句中的条件用到相关的列时,索引会自动提高查询效率
当表中数据发生变化时,索引也会自动更新,将相关数据关联起来

–b树索引适用于某列数据有大量的不相同的数据时
–当某一列有大量重复的数据时,不适合使用b树索引,应该使用位图索引

2.位图索引
位图索引使用二进制数来存储具体某一行的键值
create bitmap index 索引名称 on 表名(列名);
CREATE BITMAP INDEX index2 ON emp(deptno);