视图
视图是从一个或几个实体表(或视图)导出的表。它与实体表不同,视图本身是一个不包含任何真实数据的虚拟表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的实体表中。所以实体表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,通过它可以看到数据库中自己感兴趣的数据及其变化。
视图的优点:
- 视图能够简化用户的操作;
- 视图使用户能以多种角度看待同一数据;
- 视图对重构数据库提供了一定程度的逻辑独立性;
- 视图能够对机密数据提供安全保护;
- 适当的利用视图可以更清晰的表达查询;
创建视图语法
CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)]
AS
子查询 ;
语法参数:在创建视图中的主要参数解释如下:
FORCE:表示要创建视图的表不存在也可以创建视图;
NOFORCE:(默认)表示要创建视图的表必须存在,否则无法创建;
OR REPLACE:表示视图的替换,如果创建的视图不存在则创建新的,如果视图已经存在,则将其进行替换。
授权创建视图的权限
GRANT CREATE VIEW TO tests;
简单视图:
示例一、创建一张基本工资大于2000的视图
CREATE VIEW v_empview AS SELECT * FROM emp WHERE sal>2000;
查询视图是否创建成功
SELECT * FROM tab WHERE tabtype=‘VIEW‘;
查询v_empview视图
SELECT * FROM v_empview;
查询视图的具体信息
SELECT view_name,text_length,text FROM User_Views;
示例二、创建一张只包含20部门员工信息的视图
CREATE OR REPLACE VIEW v_emp20 AS SELECT * FROM emp WHERE deptno=20;
--查询是否创建成功 SELECT * FROM tab WHERE tabtype=‘VIEW‘; --查询myemponly_dept20视图 SELECT * FROM v_myemponly_dept20;
在视图下执行DML操作
示例三、
创建一张只包含20部门员工信息的视图,并增加一条信息
CREATE OR REPLACE VIEW v_emp20 AS SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno=20;
--查询v_myview视图 SELECT * FROM v_emp20;
--向v_emp20视图中增加一条数据 INSERT INTO v_emp20(EMPNO,ENAME,JOB,sal,deptno)VALUES(8888,‘JAVA‘,‘CLERK‘,1000,20); COMMIT; --查询v_myview视图 SELECT * FROM v_emp20; --结果增加成功
示例四、对视图执行修改操作
UPDATE v_emp20 SET ename=‘ORACLE‘,job=‘MANAGER‘,sal=2000 WHERE empno=8888; COMMIT; --查询v_myview视图 SELECT * FROM v_emp20;
示例五、删除v_emp20视图中的数据
DELETE FROM v_emp20 WHERE empno=8888; COMMIT; --查询v_myview视图 SELECT * FROM v_emp20;
复杂视图
包含多个表的映射的视图
示例六、显示每个部门的详细信息
CREATE OR REPLACE VIEW v_myview AS SELECT d.deptno,d.dname,d.loc, COUNT(e.empno) COUNT,NVL(ROUND(AVG(sal),2),0) AVG, NVL(SUM(sal),0) SUM, NVL(MAX(sal),0) MAX ,NVL(MIN(sal),0) MIN FROM emp e,dept d WHERE e.deptno(+)=d.deptno GROUP BY d.deptno,d.dname,d.loc --查询v_myview视图 SELECT * FROM v_myview;
示例七、为视图中的查询的列起别名
CREATE OR REPLACE VIEW v_myview (部门编号,部门名称,部门位置,人数,平均工资,总工资,最高工资,最低工资) AS SELECT d.deptno,d.dname,d.loc, COUNT(e.empno) COUNT,NVL(ROUND(AVG(sal),2),0) AVG, NVL(SUM(sal),0) SUM, NVL(MAX(sal),0) MAX ,NVL(MIN(sal),0) MIN FROM emp e,dept d WHERE e.deptno(+)=d.deptno GROUP BY d.deptno,d.dname,d.loc --查询v_myview视图 SELECT * FROM v_myview;
对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作
但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作。当视图符合以下任何一种情况时,都不允许直接执行DML操作。具体情况如下:
1)具有集合操作符(UNION,UNION ALL,INTERSECT,MINUS);
2)具有分组函数(MIN,MAX,SUM,AVG,COUNT等);
3)具有GROUP BY,CONNECT BY或START WITH等子句;
4)具有DISTINCT关键字;
5)具有连接查询;
为了在具有以上情况的复杂视图上执行DML操作需要征用触发器来完成
WITH CHECK OPTION 子句----保证视图的创建条件不被更改
在创建视图的时候有时候需要使用一些WHERE子句做一些条件的限制,
但是默认情况下的视图创建完成之后,是可以通过视图去修改在WHERE子句之中所使用的字段内容的,
而在此时就需要通过WITH CHECK OPTION子句来保证视图的创建条件不被更新。
语法:
WITH CHECK OPTION子句 CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)] AS 子查询 [WITH CHECK OPTION [ CONSTRAINT 约束名称] ];
示例八、创建一张只包含20部门人数的视图,添加约束,部门编号不可更改
CREATE OR REPLACE VIEW v_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION CONSTRAINT v_emp20_ck;---constraint后为可选不写也可以 --查询v_myview视图 SELECT * FROM v_emp20; --如果现在更新数据并将部门编号更改为其它就会报错并提示违返了where条件 UPDATE v_emp20 SET deptno=40 WHERE empno=7369;
WITH READ ONLY子句--让视图中所有字段不可更新
语法:
WITH READ ONLY子句 CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)] AS 子查询 [WITH CHECK OPTION [ CONSTRAINT 约束名称] ] [WITH READ ONLY] ;
示例八、创建一张只包含20部门人数的视图,添加约束设置为只读
CREATE OR REPLACE VIEW v_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH READ ONLY; --设置为只读属性 --查询v_myview视图 SELECT * FROM v_emp20; --如果现在更新数据就会报错并提示违返了where条件 UPDATE v_emp20 SET ename=‘TTTT‘,comm=NULL WHERE empno=7369;
删除视图
DROP VIEW 视图名
示例九、删除v_myview视图
DROP VIEW v_myview;
--查询user_views数据字典 SELECT view_name,text_length,text,read_only FROM user_views;