Oracle(11g)数据库教程之十二:Oracle视图
准备工作:
先启动Oracle,并打开前期建立的数据库和表
查看每个表的结构:
问:什么是视图?视图是干什么用的?
答:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。
问:为什么要使用视图?
答:使用视图的大部分情况是为了保障数据安全性,提高查询效率。
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
1)OR REPLACE:表示替换已有视图
2)ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表
3)select_statement:表示select语句
4)[WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内
cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件
local表示更新视图的时候,要满足该视图定义的一个条件即可
TIPS:推荐使用WHIT [CASCADED|LOCAL] CHECK OPTION选项,可以保证数据的安全性
基本格式:
create view <视图名称>[(column_list)]
as select语句
with check option;
1、在单表上创建视图
查看视图结构
查询结果
2、在多表上创建视图:建立一个视图,包括:学号,姓名,所学课程及成绩
查询视图记录
视图将我们不需要的数据过滤掉,将相关的列名用我们自定义的列名替换。
1、使用设计视图可查看视图信息
2、视图一旦创建完毕,就可以像一个普通表那样使用,视图主要用来查询
三、视图的更改
1、CREATE OR REPLACE VIEW语句修改视图
基本格式:
create or replace view view_name as select语句;
在视图存在的情况下可对视图进行修改,视图不在的情况下可创建视图
查询结果:
2、DML操作更新视图
因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中
例1:在v_stu把“王林”改成“王小林”,观察在基表student的变化
查询基表student的变化
例2、在视图v_stu中插入一条数据:然后查看基表的变化
学号:192025101 姓名:张三 专业:物联网工程
查询基表数据:
3、在视图v_stu 中把上一题插入数据删除,然后查看基表数据:
当然,视图的DML操作,不是所有的视图都可以做DML操作。
有下列内容之一,视图不能做DML操作:
①select子句中包含distinct
②select子句中包含组函数
③select语句中包含group by子句
④select语句中包含order by子句
⑤select语句中包含union 、union all等集合运算符
⑥where子句中包含相关子查询
⑦from子句中包含多个表
⑧如果视图中有计算列,则不能更新
⑨如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
4、drop删除视图
删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
如果视图不存在,则抛出异常;
再次删除v_stu。因不存在抛出错误。
四、检查视图:使用WITH CHECK OPTION约束
对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束
作用:
对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。
示例:创建视图,包含1990年之前出生的所有学生
查询视图结果:
此时,使用update对视图进行修改:
因为违反了视图中的where birthday < '1990-01-01'子句,所以抛出异常;
利用with check option约束限制,保证更新视图是在该视图的权限范围之内。