视图的概念 
  视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。通过视图来查看表,就像是从不同的角度来观察一个(或多个)表。 
视图有如下一些优点: 
* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。 
* 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。 
* 一个视图可以检索多张表的数据,因此用户通过访问一个视图,可完成对多个表的访问。 
* 视图是相同数据的不同表示,通过为不同的用户创建同一个表的不同视图,使用户可分别访问同一个表的不同部分。 
视图可以在表能够使用的任何地方使用,但在对视图的操作上同表相比有些限制,特别是插入和修改操作。对视图的操作将传递到基表,所以在表上定义的约束条件和触发器在视图上将同样起作用。

视图的创建 
创建视图需要CREAE VIEW系统权限,视图的创建语法如下: 
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名[(别名1[,别名2...])] 
AS 子查询 
[WITH CHECK OPTION [CONSTRAINT 约束名]] 
[WITH READ ONLY] 
其中: 
OR REPLACE 表示替代已经存在的视图。 
FORCE表示不管基表是否存在,创建视图。 
NOFORCE表示只有基表存在时,才创建视图,是默认值。 
别名是为子查询中选中的列新定义的名字,替代查询表中原有的列名。 
子查询是一个用于定义视图的SELECT查询语句,可以包含连接、分组及子查询。 
WITH CHECK OPTION表示进行视图插入或修改时必须满足子查询的约束条件。后面的约束名是该约束条件的名字。 
WITH READ ONLY 表示视图是只读的。 
删除视图的语法如下: 
DROP VIEW 视图名; 
删除视图者需要是视图的建立者或者拥有DROP ANY VIEW权限。视图的删除不影响基表,不会丢失数据。 
1.创建简单视图 (一个行转列)
create or replace view v_iews as
select ename 
  ,max(decode(deptno,'10',job))"10"
  ,max(decode(deptno,'20',job))"20"
  ,max(decode(deptno,'30',job))"30"
  ,max(decode(deptno,'40',job))"40" from emp group by ename

执行结果:

select * from v_iews;

ENAME 10 20 30 40
ADAMS   CLERK    
ALLEN     SALESMAN  
BLAKE     MANAGER  
CLARK MANAGER      
FORD    ANALYST    
JAMES     CLERK  
JONES   MANAGER    
KING PRESIDENT      
MARTIN     SALESMAN  
MILLER CLERK        
SCOTT   ANALYST    
SMITH   CLERK    
TURNER     SALESMAN  
WARD     SALESMAN  
YA_PING   ANALYST    
      CEO
杨平       CEO
2.创建只读视图 
创建只读视图要用WITH READ ONLY选项。 
  1. CREATE OR REPLACE VIEW vi_manager
  2. AS SELECT * FROM emp WHERE job= 'MANAGER'
  3. WITH READ ONLY;

执行

DELETE FROM vi_manager;

SQL> delete from vi_manager;

delete from vi_manager

ORA-01752: 不能从没有一个键值保存表的视图中删除

3.创建基表不存在的视图 
正常情况下,不能创建错误的视图,特别是当基表还不存在时。但使用FORCE选项就可以在创建基表前先创建视图。创建的视图是无效视图,当访问无效视图时,Oracle将重新编译无效的视图。 
使用FORCE选项创建带有错误的视图:

4.视图的操作 
对视图经常进行的操作是查询操作,但也可以在一定条件下对视图进行插入、删除和修改操作。对视图的这些操作最终传递到基表。但是对视图的操作有很多限定。如果视图设置了只读,则对视图只能进行查询,不能进行修改操作。 
1.视图的插入 
步骤2:创建视图:
CREATE OR REPLACE VIEW vi_dept10    
        AS SELECT * FROM emp WHERE deptno= 10;
步骤2:插入新员工:
insert into vi_dept10 values (8888,'liping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10);
步骤3:查询实体表
select * from emp where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7782  CLARK MANAGER 7839 1981-06-09 2450.00   10
7839  KING PRESIDENT   1981-11-17 5000.00   10
7934  MILLER CLERK   7782 1982-01-23 1300.00   10
8888  liping CEO 7782 1983-04-28 5000.00 0.00 10
视图中插入其他部门的员工,结果会怎么样呢?结果是允许插入.但是在视图中看不见,在基表中可以看见,这显然是不合理的。 
2.使用WITH CHECK OPTION选项
如果设置了WITH CHECK OPTION选项,那么只有部门编号为20的员工才能通过视图进行插入。 
使用WITH CHECK OPTION选项限制视图的插入。 
步骤1:新建部门20视图,带WITH CHECK OPTION选项:
 CREATE OR REPLACE VIEW vi_dept20    
        AS SELECT * FROM emp WHERE deptno= 20
        with check option;
步骤2:插入新员工:
SQL> insert into vi_dept20 values (8889,'ping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10);
insert into vi_dept20 values (8889,'ping','CEO',7782,to_date('1983-04-28','yyyy-mm-dd'),5000,0,10)
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
3.来自基表的限制 
除了以上的限制,基表本身的限制和约束也必须要考虑。

5.视图的查看 
USER_VIEWS字典中包含了视图的定义。 
USER_UPDATABLE_COLUMNS字典包含了哪些列可以更新、插入、删除。 
USER_OBJECTS字典中包含了用户的对象。 
可以通过DESCRIBE命令查看字典的其他列信息。在这里给出一个训练例子。

SQL> SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='VI_DEPT10';

TEXT
--------------------------------------------------------------------------------
SELECT "EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO" FROM emp WHERE

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视图总结(转)

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

  6. ORACLE 视图的 with check option

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

  7. ORACLE视图添加备注

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

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

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

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

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

  10. (转)oracle视图详解

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

随机推荐

  1. java 常用第3方工具

    https://www.cnblogs.com/chenpi/p/5608628.html#_label4

  2. mobile-net v2 学习记录。我是菜鸡!

    声明:只是自己写博客总结下,不保证正确性,我的理解很可能是错的.. 首先,mobile net V1的主要特点是: 1.深度可分离卷积.用depth-wise convolution来分层过滤特征,再 ...

  3. Spark读取配置(转)

    转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...

  4. SpringMVC是单例的

    spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道(主要是我没看过spring ...

  5. unzip解压带密码的压缩包

    // 解压 String pw = "123456"; String cmd = "unzip -P " + pw + " /root/lianlia ...

  6. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

  7. openwrt多wan限上下行速脚本,基于qosv4,imq模块替换成ifb模块[ZT]

    转自: http://www.right.com.cn/forum/thread-169414-1-1.html ,本人未经测试,转来自已备用 由于树莓派2装openwrt官方没有imq模块, 好像说 ...

  8. IIS 7配置需要注意的地方,RTX SDK运行必须Enable 32-bit Applications为True

    简单说一下IIS 7的配置里那些需要注意的 首先每个网站都必须运行在特定得程序池上,程序池的配置中,关键的几个如下图: 1. .Net Framework Version : 这个设置的是你项目用到的 ...

  9. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  10. Java8 parallelStream与迭代器Iterator性能

    定义一个测试类 public class TestParallelStream { private List<Integer> list; private int size; privat ...