Oracle-DDL 2- 视图&索引

时间:2019-08-16
本文章向大家介绍Oracle-DDL 2- 视图&索引,主要包括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);

原文地址:https://www.cnblogs.com/JodieRao/p/11358213.html