3.3、视图

视图:是一个封装了各种复杂查询的语句,就称为视图。
创建视图
       CREATE VIEW 视图名字(字段) AS 子查询
 
建立一个只包含20部门雇员信息的视图(雇员的编号、姓名、工资)
       CREATE VIEW empv20 (empno,ename,sal) AS SELECT empno,ename,sal FROM emp WHERE deptno=20 ;
 
例如:将之前的一个复杂语句包装成视图
显示部门内最低工资比20部门最低工资要高的部门的编号及部门内最低工资:
SELECT deptno,MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=20) ;
       此时就可以将上面的复杂查询语句建立一张视图,之后查询视图即可。
 
注意:
       如果要创建一个同名的视图,则必须先将之前的视图删除掉,再进行创建:
              DROP VIEW empv20 ;
       有些时候如果先删除再创建操作会比较麻烦,所以有时候最好的方式:如果视图存在则先自动删除,之后自动创建。
CREATE OR REPLACE VIEW empv20 (deptno,msal) AS (SELECT deptno,MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=20)) ;
 
注意点:
       例如,还是创建一个只包含20部门的视图
              CREATE OR REPLACE VIEW empv20 (empno,ename,sal,deptno) AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20 ;
       现在直接更新视图里的数据
              7369的雇员编号修改为30。此操作在视图中完成。
                     update empv20 SET deptno=30 where empno=7369 ;
              此时,提示更新完成。
       默认情况下创建的视图,如果更新了,则会自动将此数据从视图中删除,之后会更新原本的数据。
 
思考:
       如果能这样做的话,肯定存在问题,因为视图最好还是不要更新。
在建立视图的时候有两个参数:
       · WITH CHECK OPTION  à 保护视图的创建规则
CREATE OR REPLACE VIEW empv20 (empno,ename,sal,deptno)
AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20
WITH CHECK OPTION CONSTRAINT empv20_ck;
       再执行更新操作:
              update empv20 SET deptno=30 where empno=7369 ; à 此处更新的是部门编号,失败
                     |- 之前是按照部门编号建立的视图,所以不能修改部门编号
              update empv20 SET ename='tom' where empno=7369 ; à 可以更新,更新的是名字,成功
       · WITH READ ONLY(只读,不可修改),视图最好不要轻易的修改
CREATE OR REPLACE VIEW empv20 (empno,ename,sal,deptno)
AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20
WITH READ ONLY;
       现在任意的字段都不可更改,所以现在的视图是只读的。