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

视图的创建 
创建视图需要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. [记录] Linux Apache隐藏index.php

    1. 在项目更目录下新建 .htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEng ...

  2. react-native Animated, 旋转动画

    Animated 仅封装了四个可以动画化的组件: View.Text.Image.ScrollView 可以使用 Animated.createAnimatedComponent()来封装你自己的组件 ...

  3. 深度学习原理与框架-神经网络-线性回归与神经网络的效果对比 1.np.c_[将数据进行合并] 2.np.linspace(将数据拆成n等分) 3.np.meshgrid(将一维数据表示为二维的维度) 4.plt.contourf(画出等高线图,画算法边界)

    1. np.c[a, b]  将列表或者数据进行合并,我们也可以使用np.concatenate 参数说明:a和b表示输入的列表数据 2.np.linspace(0, 1, N) # 将0和1之间的数 ...

  4. day24-抽象类与接口类

    接口类 1.继承有两种用途:一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继 ...

  5. Aop 基础

    基础文献 https://blog.csdn.net/abcd898989/article/details/50809321 简单Demo配置 pom.xml <!-- AOP --> & ...

  6. redis如何清除所有的key

    redis比memcache好的地方之一,如果memcache,恐怕就得关掉重启了. 1 使用cli FLUSHDB 清除一个数据库,FLUSHALL清除整个redis数据. 2 使用shell re ...

  7. Delphi 字符串截取函数

    如果要使用LeftStr,RightStr,MidStr必需引用系统单元StrUtils; 声明变量Str:string; Str:=HelloWorld; 1,LeftStr(Str,2)=He;/ ...

  8. kinematic与static刚体不会触发任何接触回调

    Main.as package{ import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamic ...

  9. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

  10. sqlalchemy学习-- 重要参数

    Base = declarative_base 基类: 1.存储表 2.建立class-Table 的映射关系 engine = create_engine('mysql://root:root@lo ...