Oracle--视图操作

视图
一、视图简介:
视图是基于其他表或者其他视图的逻辑表,它本身没有任何数据。
在视图上的SELECT,INSERT,UPDATE和DELETE等操作实际都是针对视图基表来完成的。
视图的作用:
1.限制数据访问。因为视图定义对应于SELECT语句,所以当访问视图时只能访问SELECT语句所涉及到的列。
2.简化复杂查询。如果经常需要在多个表之间执行复杂查询操作,那么可以基于该复杂查询语句建立视图。
这样,当查询该视图时,Oracle内部会执行视图符对应的复杂查询语句。
视图分类:
1.简单视图,它是基于单个表所建立的,不包含任何函数、表达式以及分组数据的视图。
2.复杂视图,它是指包含函数、表达式或者分组数据的视图,使用复杂视图的主要目的是为了简化查询操作。
3.连接视图,它是指基于多个表所建立的视图,使用连接视图的主要目的是为了简化连接查询。
4.只读视图,它是指只允许执行SELECT操作,而禁止任何DML操作的视图。
在视图上执行DML操作的原则:
1.DELETE操作原则:如果视图包含有GROUP BY子句、分组函数、DISTINCT关键字和ROWNUM伪列,那么不能在该视图上执行DELETE操作。
2.UPDATE操作原则:如果视图包含有GROUP BY子句、分组函数、DISTINCT关键字、ROWNUM伪列以及使用表达式所定义的列,那么不能在该视图上执行UPDATE操作。
3.INSERT操作原则:如果视图包含有GROUP BY子句、分组函数、DISTINCT关键字、ROWNUM伪列以及使用表达式所定义的列,或者在视图上没有包含视图基表的NOT NULL列,那么不能在该视图上执行INSERT操作。
二、建立视图
建立视图是使用CREATE VIEW命令来完成的。
为了在当前方案中建立视图,要求数据库用户必须具有CREATE VIEW系统权限;
为了在其他方案中建立视图,要求数据库用户必须具有CREATE ANY VIEW系统权限。
建立视图的语法如下:
CREATE VIEW view [(alias[,alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
如上所示,view用于指定视图名,alias用于指定视图列的别名,subquery用于指定视图所对应的子查询语句,
WITH CHECK OPTION子句用于在视图上定义CHECK约束;WITH READ ONLY子句用于定义只读视图。
注意:当当建立视图时,如果不提供视图列别名,那么Oracle会自动使用子查询的列名或者列别名;
如果视图子查询包含有函数或表达式,那么必须要为其定义列别名。
1.示例一,建立简单视图
简单视图是指基于单个表建立,并且不包含函数或者表达式的视图。
CREATE VIEW emp_vu AS
SELECT empno,ename,sal,job,deptno FROM emp;
2.示例二,建立复杂视图
复杂视图是指包含函数、表达式或者分组数据的视图,它主要用于执行查询操作,而执行DML操作必须要符合特定条件。
注意,当定义复杂视图时,必须要为函数或者表达式定义列别名。
CREATE VIEW job_vu AS
SELECT job,avg(sal) avgsal,sum(sal) sumsal,
max(sal) maxsal,min(sal) minsal
FROM emp GROUP BY job;
3.示例三,建立连接视图
连接视图是指基于多个表所建立的视图,它主要用于简化连接查询操作。
注意,当建立连接视图时,必须在where子句中指定有效的连接条件,否则结果将毫无意义。
CREATE VIEW dept_emp_vu20 AS
SELECT a.deptno,a.dname,a.loc,b.empno,b.ename,b.sal
FROM dept a,emp b
where a.deptno=b.deptno and a.deptno=20;
4.示例四,建立只读视图
只读视图是指只允许执行SELECT操作,而禁止任何DML操作的视图。通过在建立视图时指定WITH READ ONLY选项,可以定义只读视图。
当定义了只读视图之后,用户只能在该视图上执行SELECT语句,而不允许执行INSERT,UPDATE和DELETE语句。
CREATE VIEW emp_vu20 AS
    SELECT * FROM emp WHERE deptno=20 WITH READ ONLY;
5.示例五,在建立视图时定义CHECK约束
WITH CHECK OPTION选项用于在视图上定义CHECK约束。当在视图上定义了CHECK约束之后,如果在视图上执行INSERT和UPDATE操作,
那么要求新数据必须是视图子查询的查询结果。
CREATE VIEW emp_vu10 AS
    SELECT * FROM emp where deptno=10
    WITH CHECK OPTION CONSTRAINT chk_vu10;
当执行完以上语句后,再对其执行INSERT操作时,DEPTNO列的值必须要设置为10;
当对其执行UPDATE操作时,只能修改除DEPTNO列之外的其他列。
6.示例六,在建立视图时定义列别名
当建立视图时,如果不指定视图列的别名,那么会使用子查询的列名或者列别名作为视图列的别名。另外,在建立视图时可以直接指定列别名。
三、维护视图
1.修改视图定义
当建立视图时,必须指定视图所对应的子查询语句。在建立了视图之后,如果要改变视图所对应的子查询语句,那么可以使用CREATE OR REPLACE VIEW语句修改视图定义。
CREATE OR REPLACE VIEW emp_vu(name,salary,title)
AS SELECT ename,sal,job FROM emp;
2.重新编译视图
当改变了视图基表的定义(例如增加列,删除列等)之后,视图会被标记为无效状态。当用户访问视图时,Oracle会自动重新编译视图。
另外,也可以执行ALTER VIEW语句手工编译视图。语法如下:
ALTER VIEW view COMPILE;
如上所示,view用于指定视图的名称。用户可以直接编译其自身方案的视图,但如果要编译其他用户的视图,则要求该用户必须具有ALTER ANY VIEW系统权限。
ALTER VIEW emp_vu COMPILE;
3.删除视图
当视图不再需要时,用户可以执行DROP VIEW 语句删除视图。语法如下:
DROP VIEW view;
如上所示,view用于指定视图的名称。用户可以直接删除自身方案的视图。但如果要删除其他方案的视图,则要求该用户必须具有DROP ANY VIEW系统权限。
DROP VIEW emp_vu;
四、显示视图信息
1.USER_VIEWS
当建立视图时,Oracle会将视图的相关信息存放到数据字典中。通过查询数据字典视图USER_VIEWS,可以显示当前用户所有视图的详细信息。
SELECT text FROM user_views WHERE view_name='EMP_VU';
如上所示,view_name用于表示视图名,text用于标识视图所对应的子查询。
2.USER_UPDATE_COULUMNS
视图不仅可以用于执行查询操作,而且还可以用于执行DML操作,但不同视图可以执行的DML操作有所不同。通过查询数据字典视图USER_UPDATABLE_COLUMNS,
可以显示是否允许在特定视图列上执行DML操作。
SELECT column_name,insertable,updatable,deletable
FROM user_updatable_columns
WHERE table_name='DEPT_EMP_VU20' AND
column_name IN ('DNAME','ENAME');


 

 

 

 

 

 

你可能感兴趣的:(Oracle)