一、什么是视图?
oracle视图可以理解为数据库中一张虚拟的表,它是通过一张或者多张基表进行关联查询后组成一个虚拟的逻辑表。查询视图,本质上是对表进行关联查询。
视图的本身是不包含任何数据,只是一个查询结果,当基表的数据发生变化时,视图里面的数据也会跟着发生变化。我们经常在实际开发过程中遇到的视图可以大概分为三种:单表视图、多表关联视图、视图中含有子视图。
二、视图的优势和作用
1、使数据简单化:可以将复杂的查询创建成视图,提供给他人使用,他人就不需要去理解其中复杂性的业务关系或逻辑关系。这样对视图的使用人员来说,就屏蔽了数据的复杂性。
2、表结构设计的补充:系统刚刚开始设计时,大部分程序是直接访问表结构的数据,但是随着业务的变化、系统的更新等,造成了某些表结构的不适用,这时候去修改表结构对系统的影响太大,开发成本较高,这个时候可以创建视图来对表结构的设计进行补充,降低开发成本。程序可以直接通过查询视图得到想要的数据。
3、增加安全性:视图可以把表中指定的字段展示给用户,而不必把表中所有字段一起展示给用户。在实际开发中,视图经常作为数据的提供方式,设置为只读权限提供给第三方人员进行查询使用。
三、创建视图
1、权限:要在当前方案中创建视图, 用户必须具有create view系统权限, 要在其他方案中创建视图, 用户必须具有create any view系统权限,视图的功能取决于视图拥有者的权限。
2、语法:create [ or replace ] [ force ] view [schema.] view_name
[ (column1,column2,...) ]
as
select ...
[ with check option ] [ constraint constraint_name ]
[ with read only ];
<1>: or replace: 如果存在同名的视图,则使用新视图"替代"已有的视图。
<2>: force: "强制"创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限。
<3> :column1,column2,...:视图的列名, 列名的个数必须与select查询中列的个数相同,如果select查询包含函数或表达式,则必须为其定义列名,此时,既可以用column1,column2指定列名,也可以在select查询中指定列名。
<4> :with check option: 指定对视图执行的dml操作必须满足“视图子查询”的条件,即对通过视图进行的增删改操作进行"检查",要求增删改操作的数据,必须是select查询所能查询到的数据,否则不允许操作并返回错误提示,默认情况下,在增删改之前"并不会检查"这些行是否能被select查询检索到。
<5> :with read only:创建的视图只能用于查询数据,而不能用于更改数据。
四、实例
利用学生信息表(stuinfo)、班级表(class)关联创建视图,只提供一些学生基本信息和班级信息(剔除学生一些敏感信息:如身份证,家庭地址等)。
create view vw_stuinfo
as select a.stuid,--学号
a.stuname,--学生姓名
a.grade,--年级
a.sex,--性别(1:男、2:女)
a.age,--年龄
b.classname,--班级
b.monitorname,--班长
b.headmastername--班主任
from stuinfo a, class b
where a.classno = b.classno;
查询:
select * from vw_stuinfo;