视图简介: 
视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。 通过创建视图可以提取数据的逻辑上的集合或组合。

视图的优点: 
1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 
2.用户通过简单的查询可以从复杂查询中得到结果。 
3.维护数据的独立性,试图可从多个表检索数据。 
4.对于相同的数据可产生不同的视图。

视图的分类: 
视图分为简单视图和复杂视图。

两者区别如下: 
1.简单视图只从单表里获取数据,复杂视图从多表获取数据; 
2.简单视图不包含函数和数据组,复杂视图包含; 
3.简单视图可以实现DML操作,复杂视图不可以。

视图的创建:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] 
AS subquery 
[WITH CHECK OPTION [CONSTRAINT constraint]] 
[WITH READ ONLY] 
其中: 
OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图; 
FORCE:不管基表是否存在ORACLE都会自动创建该视图; 
NOFORCE:只有基表都存在ORACLE才会创建该视图: 
alias:为视图产生的列定义的别名; 
subquery:一条完整的SELECT语句,可以在该语句中定义别名; 
WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束; 
WITH READ ONLY : 该视图上不能进行任何DML操作。

例如:

  1. CREATE  OR  REPLACE  VIEW  dept_sum_vw
  2. (name,minsal,maxsal,avgsal)
  3. AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
  4. FROM    emp e,dept d
  5. WHERE  e.deptno=d.deptno
  6. GROUP  BY  d.dname;

视图的定义原则: 
1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 
2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用 ORDER BY 子句; 
3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn; 
4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。

查询视图: 
视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。 
示例: 
SQL>SELECT * FROM dept_sum_vw;

修改视图: 
通过OR REPLACE 重新创建同名视图即可。

删除视图: 
DROP VIEW VIEW_NAME语句删除视图。 
删除视图的定义不影响基表中的数据。 
只有视图所有者和具备DROP VIEW权限的用户可以删除视图。 
视图被删除后,基于被删除视图的其他视图或应用将无效。

查询视图定义: 
SELECT view_name,text from user_views; 
其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 
得到相关信息。

视图上的DML 操作: 
DML操作应遵循的原则: 
1.简单视图可以执行DML操作; 
2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 
3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:

a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; 
b.使用表达式定义的列; 
c.ROWNUM伪列。 
d.基表中未在视图中选择的其他列定义为非空且无默认值。 
WITH CHECK OPTION 子句 
通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行, 因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。 (也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)

例如:

CREATE OR REPLACE VIEW  vw_emp20 
AS  SELECT *  FROM  emp 
WHERE  deptno=20 
WITH CHECK OPTION constraint  vw_emp20_ck; 
视图 已建立。

查询结果:

SELECT empno,ename,job FROM vw_emp20; 
EMPNO                ENAME                JOB 
---------------------           --------------          ------------- 
7369                 SMITH                CLERK 
7566                 JONES               MANAGER 
7902                 FORD                ANALYST 
修改:

UPDATE vw_emp20 
SET        deptno=20 
WHERE   empno=7902; 
将产生错误:

UPDATE vw_emp20 

ERROR 位于第一行: 
ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1,Oracle是可以通过视图来修改Base table的。所谓base table就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如: 
create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst; 
如果有这个限制,那么通过视图v_emp 插入数据的deptno字段的值必须是10,否则就会报“ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句”的异常。

2,联结视图: 
create view dept1_staff as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.deptno in (10,30) and e.deptno = d.deptno; 
将两个表的数据联结起来,看起来应该是一个内联结(Inner joint)。 
对于联结视图(Joint view)的修改规则稍显复杂,设计到所谓key_preserved table的概念。通过联结视图来修改基表,只有那些key_preserved 的表才能被修改。上述创建视图语句中emp和dept通过deptno进行联结构成视图时,emp就是key_preserved 表,而dept不是。为什么?因为在dept1_staff 中empno的值唯一的而deptno不是唯一的。所以emp是key_preserved 而dept不是。因此只能通过该视图来修改emp,而不能修改dept的数据。

3,Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成视图里的该字段名称,那么视图马上就可以成为合法的。这个功能很有意思。 
例子: 
创建基表: create table v_test (name varchar2(32),age number(12)); 
创建带错误的视图: 
create force view view_test as select name,age,address from v_test;(注意加上force选项) 
由于address字段在v_test里不存在,所以会报warning: View created with compilation errors的警告,而且执行select * from view_test;时会报“ORA-04063: view “SCOTT.VIEW_TEST” 有错误”的异常。 
但是如果在v_test里加上address字段,那么视图就会合法。 
对基表进行修改: 
alter table v_test add (address varchar2(128));

现在再执行select * from view_test;就会执行成功了。

from:http://www.blogjava.net/jinhualee/archive/2006/07/14/58115.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

其他问题总结: 
1、视图上是否可以创建索引? 
一般视图上不用建立索引,对视图的操作最终会转化为对表的操作。 
一个讨论:http://www.itpub.net/viewthread.php?tid=150019&extra=&page=1

oracle视图总结(转)的更多相关文章

  1. Oracle视图分类及各种操作讲解(超级好文)

    目录:一.视图的定义: 二.视图的作用: 三.创建视图: 1.权限 2.语法 3.1  创建简单视图   3.2  创建连接视图  3.2.1 连接视图定义  3.2.2 创建连接视图  3.2.3 ...

  2. Oracle -----视图

    视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...

  3. Oracle视图详解

    转载自:http://blog.itpub.net/29785807/viewspace-1270120/ 一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本 ...

  4. oracle视图总结

    视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...

  5. ORACLE 视图的 with check option

    ORACLE 视图的 with check option 我们来看下面的例子: create or replace view testview as select empno,ename from e ...

  6. ORACLE视图添加备注

    ORACLE视图添加备注 版权声明:本文为博主原创文章,未经博主允许不得转载. create or replace view oes_material_series_ref as select t.p ...

  7. Oracle 视图 (待更新, 缓存)

    参考: 视图.索引.存储过程优缺点: http://www.cnblogs.com/SanMaoSpace/p/3147059.html oracle视图总结(转):http://tianwei013 ...

  8. Oracle视图(和Mysq一样l)

    本章内容: Oracle视图介绍与创建.Oracle视图的查询与修改.Oracle的复杂视图 1. Oracle视图介绍与创建 (1)了解常见的数据库对象都有哪些 (2)了解什么是视图以及为什么要使用 ...

  9. (转)oracle视图详解

    Oracle视图详解   一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执 ...

随机推荐

  1. Java加解密与数字签名

    ** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...

  2. duilib中各控件响应的消息类型

    消息 说明 Sender click 鼠标点击 CButtonUI dropdown 下拉显示 CComboUI headerclick 点击列标题 CListHeaderItemUI itemact ...

  3. Extjs4 使用store的post方法

    Extjs4 使用store的post方法 引用官网的一句话 Now when we call store.load(), the AjaxProxy springs into action, mak ...

  4. 第五周技术博客发表 web 网页开发

    <html><head> <title> HTML</title></head><body > <h1>会员注册界面 ...

  5. 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. bzoj 3907: 网格 组合数学

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 13  Solved: 7[Submit][Status][Discuss] Descr ...

  7. 《剑指Offer》- 面试题3

    <剑指Offer——名企面试官精讲典型编程题>  面试题3:  二维数组元素从左到右.从上到下递增,输入一个二维数组和一个整数,  查找该整数. 自己的思路:有序条件下进行查找,当然最简单 ...

  8. [转载]C#中的WebBrowser控件的使用

    http://www.cnblogs.com/txw1958/archive/2012/09/24/CSharp-WebBrowser.html

  9. [转载]DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    一.错误情况 环境:win7+iis7.0 DirectoryEntry配置IIS7出现如下错误 或者是 下面一段代码在IIS6.0下运转正常,但IIS7.0下运转会出错: System.Direct ...

  10. websphere变成英文了怎么变回中文

    今天进来发现,websphere在浏览器里面居然是英文的.这是因为我的浏览器少了一个中文语言设置,其实和页面编码无关. 解决办法: IE浏览器右键属性 -- internet选项 --  常规 -- ...