视图是一个封装了各种复杂查询的语句,就成为视图。
1、创建视图
Create view 视图名字(字段)as 子查询
建立一个只包含 20 部门雇员信息的视图(雇员的编号、姓名、工资)
CREATE VIEW yx_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) ;
此时就可以将上面的复杂查询语句建立一张视图,之后查询视图即可。
注:这里提一下视图和表的区别
A.表占用物理空间,而视图只是逻辑上的存在,表可以及时对它进行修改,但是视图只能在创建的语句来修改
B.视图是查看数据表的一种方法,查询数据表中的字段的构成数据,只是一些SQL语句的集合,从安全的角度说,视图不给用户接触数据表,不知道表结构
C.表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
2、如果要创建一个同名的视图,则必须先将之前的视图删除掉,再进行创建:
DROP VIEW yx_empv20 ;
有些时候如果先删除再创建操作会比较麻烦,所以有时候最好的方式:如果视图存在则先
自动删除,之后自动创建。
CREATE OR REPLACE VIEW yx_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 yx_empv20 (empno,ename,sal,deptno) AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20 ;
现在直接更新视图里的数据
7369 的部门编号修改为 30。此操作在视图中完成。
update yx_empv20 SET deptno=30 where empno=7369 ;
此时,提示更新完成。
默认情况下创建的视图,如果更新了,则会自动将此数据从视图中删除,之后会更新原本
的数据。
如果能这样做的话,肯定存在问题,因为视图最好还是不要更新。
在建立视图的时候有两个参数:
保护视图的创建规则
CREATE OR REPLACE VIEW yx_empv20(empno,ename,sal,deptno)
AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20
WITH CHECK OPTION CONSTRAINT yx_empv20_ck;
再执行更新操作:
update yx_empv20SET deptno=30 where empno=7369 ; 此处更新的是部门编号,失败
|- 之前是按照部门编号建立的视图,所以不能修改部门编号
update yx_empv20SET ename=‘tom’ where empno=7369 ; 可以更新,更新的是名字,成功
(只读,不可修改),视图最好不要轻易的修改
CREATE OR REPLACE VIEW yx_empv20(empno,ename,sal,deptno)
AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20
WITH READ ONLY;
现在任意的字段都不可更改,所以现在的视图是只读的。
如果视图的基表有多行查询(比如:group by,distinct)那么该视图也是只读的