视图
一、介绍
视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图不是真实存在磁盘上的)
二、视图与表的区别
1、表需要占用磁盘空间,视图不需要
2、视图不能添加索引(所以查询速度略微慢点)
3、使用视图可以简化,复杂查询
4、视图的使用利于提高安全性
比如:不同用户查看不同视图
三、创建/修改视图
1、创建视图
create view 视图名 as select 语句 [with read only]
2、创建或修改视图
create or replace view 视图名 as select 语句 [with read only]
3、删除视图
drop view 视图名
视图
在之前所学习过的所有的SQL语法之中,查询操作是最麻烦的,如果程序开发人员将大量的精力都浪费在查询的编写上,则肯定影响代码的工作进度,所以一个好的数据库设计人员,除了根据业务的操作设计出数据表之外,还需要为用户提供若干个视图,而每一个视图包装了一条条复杂的SQL语句,视图的创建语法如下:
CREATE [OR REPLACE] VIEW 视图名称
AS 子查询;
范例:创建一张视图
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查询操作。
范例:创建一张包含简单查询语句的视图
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;
此时再次执行视图的更新操作,出现以下错误提示:
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;
现在的信息是统计而来的,根本就不可能更新。
在一个项目之中,视图的数量有可能超过表的数量,因为查询语句会很多的。
浙公网安备 33010602011771号