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;
|
现在任意的字段都不可更改,所以现在的视图是只读的。