Oracle笔记(十三)视图、同义词、索引(一)

2014-11-24 09:03:53 · 作者: · 浏览: 0

Oracle笔记(十三)视图、同义词、索引
相关链接:
Oracle笔记(一)Oracle简介及安装
http://www.2cto.com/database/201209/154049.html;
Oracle笔记(二)SQLPlus命令
http://www.2cto.com/database/201209/154051.html;
Oracle笔记(三)Scott用户的表结构
http://www.2cto.com/database/201209/154052.html;
Oracle笔记(四)简单查询、限定查询、数据的排序
http://www.2cto.com/database/201209/154054.html;
Oracle笔记(五)单行函数
http://www.2cto.com/database/201209/154056.html;
Oracle笔记(六)多表查询
http://www.2cto.com/database/201209/154060.html;
Oracle笔记(七)数据更新、事务处理、数据伪列
http://www.2cto.com/database/201209/154062.html;
Oracle笔记(八)复杂查询及总结
http://www.2cto.com/database/201209/154063.html;
Oracle笔记(九)表的创建及管理
http://www.2cto.com/database/201209/154316.html;
Oracle笔记(十)约束
http://www.2cto.com/database/201209/154317.html;
Oracle笔记(十一)建表、更新、查询综合练习
http://www.2cto.com/database/201209/154621.html;
Oracle笔记(十二)集合、序列
http://www.2cto.com/database/201209/154623.html
一、视图
在之前所学习过的所有的SQL语法之中,查询操作是最麻烦的,如果 程序开发人员将大量的精力都浪费在查询的编写上,则肯定影响代码的工作进度,所以一个好的 数据库设计人员,除了根据业务的操作设计出数据表之外,还需要为用户提供若干个视图,而每一个视图包装了一条条复杂的SQL语句,视图的创建语法如下:
CREATE [OR REPLACE] VIEW 视图名称
  AS 子查询; www.2cto.com
范例:创建一张视图
CREATE VIEW myview AS
  SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg
  FROM emp e,dept d
  WHERE e.deptno(+)=d.deptno
  GROUP BY d.deptno,d.dname,d.loc;
现在已经创建好了一张视图,名称为myview,所以现在查询myview:
SELECT * FROM myview;
此时通过一个简单的视图查询操作,就可以完成之前的复杂SQL语句的功能,所以视图就是包装了SQL查询操作。
www.2cto.com
范例:创建一张包含简单查询语句的视图
DROP VIEW myview;
CREATE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20;
可是以上的操作实际上是属于一个视图的替换操作,所以此时也可以使用另外一种语法:
CREATE OR REPLACE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20;
此时表示的是,如果视图存在则替换,不存在则创建一张新的视图,视图的概念虽然好理解,但是在创建视图的时候存在两个选项。
选项一:WITH CHECK OPTION
上面所创建的视图,是存在一个创建条件的“WHERE deptno=20”,那么如果现在更新视图中的这个条件呢?
UPDATE myview SET deptno=30 WHERE empno=7369;
此时更新的是一张视图,但是视图本身并不是一个具体的数据表,而且现在更新的操作又是视图的创建条件,很明显这样的做法不可取,所以此时为了解决这个问题,可以加入WITH CHECK OPTION;
CREATE OR REPLACE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20
  WITH CHECK OPTION;
www.2cto.com
此时再次执行视图的更新操作,出现以下错误提示:
ORA-01402: 视图 WITH CHECK OPTIDN where 子句违规
意味着现在根本就不能去更新视图的创建条件。
选项二:WITH READ ONLY
虽然使用WITH CHECK OPTION可以保证视图的创建条件不被更新,但是其他的字段却允许更新。
UPDATE myview SET sal=9000 WHERE empno=7369;
与之前的问题一样,视图本身不是具体的真实数据,而是一些查询语句,所以这样的更新并不合理,那么在创建视图的时候建议将其设置为只读视图:
CREATE OR REPLACE VIEW myview AS
  SELECT * FROM emp WHERE deptno=20
  WITH READ ONLY;
此时再次发出更新的操作,则直接提示如下错误:
ORA-01733: 此处不允许虚拟列
而且一定要注意的是,以上给出的是一个简单的操作语句视图,如果现在视图中的查询语句是统计操作,则根本就不可能更新。
CREATE OR REPLACE VIEW myview AS
  SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg
  FROM emp e,dept d
  WHERE e.deptno(+)=d.deptno
  GROUP BY d.deptno,d.dname,d.loc;
现在的信息是统计而来的,根本就不可能更新。
在一个项目之中,视图的数量有可能超过表的数量,因为查询语句会很多的。
二、同义词
同义词就是意思相近的一组词语,对于同义词的操作之前一直在使用,例如,现在有如下一个查询语句: www.2cto.com
SELECT SYSDATE FROM dual;
在之前说过“dual”是一张虚拟表,但是虚拟表也肯定应该有它的用户,经过查询可以发现,这张表是属于SYS用户的,但是这个时候就出现一个问题,在之前讲解过,不同的用户要想访问其他用户的表,则需要写上“用户.表名称”,那么为什么此时scott用户访问的时候直接使用dual即可,而不是使用“sys.dual”呢,这个实际上就是同义词的应用,dual表示的是sys.dual的同义