转自http://askdb.blog.163.com/blog/static/215683163201322711754198/
Hi,everybody这里来介绍另一类可以显示数据逻辑子集或组合的SCHEMA对象,视图。
1.1主要内容
1>描述什么是视图
2>创建,修改,删除视图
3> 通过视图提取数据
4> 插入,更新,删除(可更新)视图的数据
5> 创建和使用INLINE视图
6> 通过视图实现分页功能
1.2什么是视图
视图可以按每个用户不同的视角去纵向或者横向查询和显示数据子集
对于不同行业的业务表,有不同类型的数据,也有不同类型的限制
所以我们会让业务表数据更加规范,ORACLE提供了约束来实现该功能
通过创建表的视图可以显示数据的逻辑子集或组合
视图是基于表或另一个视图的逻辑表,视图没有自己的数据,它自己没有存储的段
但通过它的定义可以查看或者更改表中的数据,视图所基于的表称为基表
视图以SELECT语句的形式存储在数据字典中
我们看上图颜色部分是通过特定的视角查看到的3行6列的记录
所以视图既可以定义横向数据,又可定义纵向数据
1.3什么是视图
任何一个查询,都可以建立一个视图,或者表
为什么要使用视图? 它有如下四个优点
1>可以限制数据的访问
可以将一个大的数据集通过在视图中定义列和WHERE条件分成多个视图,并让只有有权限的人才能查看到自己的数据。
ORACLE能实现应用层的安全
你可以通过USERENV来搜索登陆的用户,如SYS_CONTEXT('userenv', 'session_user')
我们可以控制表访问权限,然后设置该视图查询权限发放给所有分支机构,这样机构用户就只能查到登陆用户自己业务的数据,别的机构用户数据你是查不到的。
2>视图可以用来简化查询,更容易建立复杂的语句
使得复杂的语句逻辑上变的更简单易懂
注意:
但其实使用视图,在某些情况下,不便于系统优化 ,因为如果视图是一个大的结果集,它先计算出来,再去过滤视图的结果势必效率非常低。
我们应该把视图强制拆分成普通子查询或者使用提示语句来实现
这属于优化的知识,先了解到这个程度
3>视图能提供相对独立的数据
4> 同样的数据可以设置不同的视图
1.4视图的分类
视图分简单视图和复杂视图
1> 简单视图
1) 简单视图只有单表
2) 没有包含分组操作和函数
3) 可以在视图上执行更新删除插入操作,这叫可更新视图
2> 复杂视图
1) 包含一个或多个表
2) 可以包含函数和分组数据
3) 有的时候不允许在视图上做DML语句,这种视图称为不可更新视图
1.5创建视图
上图是创建视图的语句
1>我们可以将子查询嵌入到创建视图的语句中
主要的关键字有
1) OR REPLACE :如果视图存在则替换它
2) FORCE:不用关心视图的基表是否存在,默认是NOFORCE
3) SUBQUERY:是一个完整的SELECT语句,定义了视图的行和列
4) WITH CHECK OPTION:用于控制DML视图时不满足视图的数据报错,只能插入或更新那些能访问的行。
WITH READ ONLY:设置只读视图
2> 子查询可以包含复杂的SELECT语句
上图是创建一个EMPVU80的视图,它包含了部门为80的信息,我们可以用DESC 视图名查看视图的结构
也可以VIEW 视图名,查看视图的定义,子查询中不能包含ORDER BY.
3> WITCH CHECK OPTION的CHECK条件上没有指派约束名,那么系统会自动生成一个SYS_Cn的约束名
4> 在子查询中使用列别名来创建视图
如果create table as select 的话,有别名的列,创建出来的表的列是别名这个也是一样的
5> 通过给定的别名从此视图中选择列
可以直接查询视图,就象查表一样,但盖住了内部执行的复杂性
表面上是这个的
但实际后面有一个复杂的过程
1.6实验,视图类