视图(学习笔记)

视图

视图是从一个或几个实体表(或视图)导出的表。它与实体表不同,视图本身是一个不包含任何真实数据的虚拟表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的实体表中。所以实体表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,通过它可以看到数据库中自己感兴趣的数据及其变化。
 
 

视图的优点:

  • 视图能够简化用户的操作;
  • 视图使用户能以多种角度看待同一数据;
  • 视图对重构数据库提供了一定程度的逻辑独立性;
  • 视图能够对机密数据提供安全保护;
  • 适当的利用视图可以更清晰的表达查询;

创建视图语法

CREATE [FORCE | NOFORCE] [OR REPLACE] VIEW 视图名称 [(别名1,别名2,...)]

AS

子查询 ;

语法参数:在创建视图中的主要参数解释如下:
FORCE:表示要创建视图的表不存在也可以创建视图;
NOFORCE:(默认)表示要创建视图的表必须存在,否则无法创建;
OR REPLACE:表示视图的替换,如果创建的视图不存在则创建新的,如果视图已经存在,则将其进行替换。
 

授权创建视图的权限

 

GRANT CREATE VIEW TO tests;  --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;
 
原文地址:https://www.cnblogs.com/liunanjava/p/4219941.html