视图

视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中
查询信息与从表中查询信息的方法完全相同。只需要简单的 SELECT…FROM 即可。
视图具有以下优点:
1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基
表。
2. 可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。
3. 限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定
的安全性。
4. 从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
语法结构:创建视图
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
AS
SELECT查询
[WITH READ ONLY CONSTRAINT]
语法解析:
1. OR REPLACE:如果视图已经存在,则替换旧视图。
2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表
创建成功后,视图才能正常使用。
3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
4. WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上
的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视
图执行 insert 操作),WITH READ ONLY 说明视图是只读视图,不能通过该视图进行
增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
案例 3:基于 EMP 表和 DEPT 表创建视图
代码演示:视图
SQL> CREATE OR REPLACE VIEW EMPDETAIL
2 AS
3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME
4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO
5 WITH READ ONLY
6 /
VIEW CREATED
SQL> SELECT * FROM EMPDETAIL; ①
EMPNO ENAME JOB HIREDATE DEPTNO DNAME
7369 SMITH CLERK 17-12 月-80 20 RESEARCH
7499 ALLEN SALESMAN 20-2 月 -81 30 SALES
7521 WARD SALESMAN 22-2 月 -81 30 SALES
7566 JONES MANAGER 02-4 月 -81 20 RESEARCH
7654 MARTIN SALESMAN 28-9 月 -81 30 SALES
7698 BLAKE MANAGER 01-5 月 -81 30 SALES
7782 CLARK MANAGER 09-6 月 -81 10 ACCOUNTING
7788 SCOTT ANALYST 19-4 月 -87 20 RESEARCH
7839 KING PRESIDENT 17-11 月-81 10 ACCOUNTING
7844 TURNER SALESMAN 08-9 月 -81 30 SALES
7876 ADAMS CLERK 23-5 月 -87 20 RESEARCH
7900 JAMES CLERK 03-12 月-81 30 SALES
7902 FORD ANALYST 03-12 月-81 20 RESEARCH
7934 MILLER CLERK 23-1 月 -82 10 ACCOUNTING
14 ROWS SELECTED
代码解析:
① 对视图可以像表一样进行查询。该视图中隐藏了员工的工资。
删除视图可以使用“DROP VIEW 视图名称”,删除视图不会影响基表的数据

*****************************我是分割线*******************************

Oracle视图详解

 
1.视图的概述    

视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) 

 
2.视图的存储 
     与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间。 
 
3.视图的作用 
     用户可以通过视图以不同形式来显示基表中的数据,视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。视图常见的用途如下: 
  • 通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制 
  • 隐藏数据复杂性 
  • 视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。
简化用户的SQL 语句 
  • 用户使用视图就可从多个表中查询信息,而无需了解这些表是如何连接的。   
  • 以不同的角度来显示基表中的数据 
  • 视图的列名可以被任意改变,而不会影响此视图的基表   
  • 使应用程序不会受基表定义改变的影响 
  • 在一个视图的定义中查询了一个包含4 个数据列的基表中的3 列。当基表中添加了新的列后,由于视图的定义并没有被影响,因此使用此视图的应用程序也不会被影响。   
保存复杂查询 
 
     一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。 
逻辑数据独立性 
 
     视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。 
4.视图的工作机制 
     视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储在数据字典中。当用户在 SQL 语句中引用了视图时,Oracle 将进行以下工作: 
  • 将引用了视图的语句与视图的定义语句整合为一个语句 
  • 在共享SQL 区解析整合后的语句 
  • 执行此语句 
  • 当现有的共享SQL 区中没有与整合后的语句一致时,Oracle 才会为此语句创建新的共享SQL 区。因此,引用了视图的SQL 语句也能够利用已有的共享 SQL 区以达到节约内存和提高性能的目的。 
 
5.视图的依赖性 
     由于视图的定义是一个引用了其他对象(表,视图)的查询,因此视图依赖于其所引用的对象。Oracle 会自动地处理视图的依赖性。例如,当用户移除了一个视图的基表后再重建此表,Oracle 将检查新的基表是否符合视图的定义并判断视图的有效性。 
 
6.可更新的连接视图 
     连接视图是指在一个视图的定义查询的from字句中引用了多个表或视图。而可更新的连接视图是指能够执行 UPDATE,INSERT,和 DELETE 操作的连接视图。为了保证视图是可更新的,其定义中不能包含以下语法结构: 
  • 集合操作符 
  • DISTINCT 操作符 
  • 聚合函数或分析型函数 
  • GROUP BY,ORDER BY,CONNECT BY,或 START WITH 字句 
  • 在 SELECT 之后的列表中使用集合表达式 
  • 在 SELECT 之后的列表中使用子查询 
  • 连接(join)(但是有例外情况) 
  • 对于不可更新的视图,可以利用 INSTEAD OF 触发器对其数据进行修改。 
原文地址:https://www.cnblogs.com/shaohz2014/p/3704813.html