20、视图

视图的功能:一个视图实际上就是封装了一条复杂的查询语句。

创建视图的语法:

CREATE VIEW 视图名称 AS 子查询

       ·实际上此时的子查询就表示一条非常复杂的语句。

范例:建立一个视图,此视图包含了全部的20部门的雇员信息(雇员编号,姓名,工作,雇佣日期)

CREATE VIEW empv20 AS SELECT empno,ename,job,hiredate FROM emp WHERE deptno=20;

       视图创建完成之后,就可以像查找表那样直接对视图进行查询操作。

范例:查询视图

SELECT * FROM empv20;

       此时,是通过视图找到的20部门的所有数据,也就是发现,可以使用视图包装需要的查询语句。

此时,此视图中只包含了四个字段的信息,如果现在希望多包含一个

CREATE VIEW empv20

       AS

       SELECT empno,ename,job,sal,hiredate FROM emp

       WHERE deptno=20;

       此时,执行创建视图的语句之后,提示,此名称已经存在了,证明视图是无法重名的,那么此时只能先删除之后再重新建立视图

删除视图的语法:

DROP VIEW 视图名称;

范例:删除empv20的视图

DROP VIEW empv20;

       删除之后,重新执行创建视图的语句

       但是,如果所有的代码都这样去写肯定很麻烦,因为如果要想修改视图,则肯定要先删除视图,所有在Oracle中为了方便用户修改视图,提供一个替换的命令,此时完整的视图创建语法如下:

CREATE OR REPLACE VIEW 视图名称 AS 子查询;

       使用以上的语法,在更改视图的时候就不用先删除再执行了,系统会为用户自动进行删除及重建的功能。

CREATE OR REPLACE VIEW empv20

       AS

       SELECT empno,ename,job,sal,hiredate FROM emp

       WHERE deptno=20;

       视图可以封装复杂的查询,那么下面封装一个之前已经存在的一个复杂查询。      

下面的查询语句查出:部门的人数,平均工资以及最低工资的雇员姓名。

SELECT d.dname,ed.c,ed.a,e.ename

FROM dept d,(

       SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min

       FROM emp

       GROUP BY deptno) ed,emp e

WHERE d.deptno=ed.deptno AND e.sal=ed.min;

       如果在开发中每次都写如此之长的SQL语句,则肯定很不方便,所以此时就应该将其建立成视图,以方便用户查询操作。

CREATE OR REPLACE VIEW myempv AS

SELECT d.dname,ed.c,ed.a,e.ename

FROM dept d,(

       SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min

       FROM emp

       GROUP BY deptno) ed,emp e

WHERE d.deptno=ed.deptno AND e.sal=ed.min;

       以后直接查询视图,就可以得到之前的查询结果

SELECT * FROM myempv;

范例:创建一个只包含20部门的雇员的视图

CREATE OR REPLACE VIEW empv20

       AS

SELECT * FROM emp WHERE deptno=20;

       下面进行更新视图的操作,在视图中是不应该包含真实数据的,而且在此程序中,创建的视图实际上是存在创建条件的,此条件是deptno=20。如果现在将视图中的7369的部门编号修改为30

范例:修改视图中的7369的部门编号

UPDATE empv20 SET deptno=30 WHERE empno=7369;

       此时,已经提示视图正常的进行了更新,重新查询视图之后,会发现在视图中已经没有7369这个雇员了,那么emp表中呢?

SELECT * FROM emp;

       发现在emp表中的7369雇员的部门编号已经修改为30了,这样做明显不合适,因为创建视图的时候是有条件的,你一旦修改之后,则此条件就破坏了,所以在创建视图的时候SQL中提供了两个重要的参数:

       ·WITH CHECK OPTION:不能更新视图的创建条件

范例:在视图创建中使用此参数

CREATE OR REPLACE VIEW empv20

       AS

SELECT * FROM emp WHERE deptno=20

WITH CHECK OPTION;

       此时,再对现在的视图进行更新操作,观察问题:

UPDATE empv20 SET deptno=30 WHERE empno=7369;

       创建条件不能更新,那么其他字段呢,例如:现在将7369的雇员姓名修改为“史密斯”

范例:修改视图中7369的雇员姓名

UPDATE empv20 SET ename='史密斯' WHERE empno=7369;

       但是,视图的本身作用还是用来查询的,所以不应该允许更改,所以此时可以使用第二个参数:

       ·WITH READ ONLY:创建的视图只读

范例:创建只读视图

CREATE OR REPLACE VIEW empv20

       AS

SELECT * FROM emp WHERE deptno=20

WITH READ ONLY;

       再次执行更新操作,更新雇员姓名:

UPDATE empv20 SET ename='史密斯' WHERE empno=7369;

       此时,提示视图无法更改,是只读的操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21817401/viewspace-620537/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21817401/viewspace-620537/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值