学习笔记:视图的作用、缺点、更新的规定[附例讲解]

视图

视图的实质是一个由一个或几个基本表(或视图)导出的虚表。其在于:数据库中只存放视图的定义,而不实现数据存储,视图中的数据随基本表中的数据的改变而改变。对用户来讲,视图更像是一个窗口,透过它可以更清晰的对自己感兴趣的数据进行分析。

视图的作用

现有两个表
orders表中有字段(ordno,month,cid,aid,pid,qty,money)
agents表中有字段(aid,aname,city,per)
作用一:简化用户的操作,更清晰的表达查询
正如上文提到的,视图像一个窗口,使用户将注意力集中在所关心的数据上。如果用户所需获取的数据不是直接来自基本表,例如所需数据需要通过表的连接来获取,那么通过定义视图,对用户隐藏表之间的连接操作,用户可以直接通过对视图的简单查询获得所需数据。相比子查询、嵌套查询等,其表达更清晰,操作更简便。

例如,要查询“每个代理商对应的业绩和姓名”,先定义一个视图找出每个的代理商的aid和销售总量

create view agents_qty(aid,sum)
as
select aid,sum(qty) from orders 
group by aid;

然后使用如下查询

select aname,sum from agents_qty,agents 
where agents_qty.aid=agents.aid

作用二:使用户以多种角度看待同一数据
当许多不同类型的用户共享同一数据库时,通过不同的视图,用户可以灵活地以多角度看待看待同一数据。

例如,选取orders表中pid(产品编号)和qty(销售数量)导出视图,可以使用户清晰的看到不同产品的畅销度;而选取orders表中的aid(代理商编号)和money(销售额)导出视图,可以使用户清晰的看到不同代理商的业务能力。

作用三:对重构数据库提供了一定程度的逻辑独立性
逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响。
在关系数据库中,数据库的重构往往不可避免。
现将orders(ordno,month,cid,aid,pid,qty,money)表“垂直”拆分为OX(ordno,month,cid,aid,money)
OY(ordno,month,pid,qty)
若用户应用程序不改变,直接对原有orders表进行查询操作,则会报错,即原有逻辑独立性已改变。基于这一点,为了满足用户的外模式保持不变,通过创建视图orders建立原来的关系。

create view orders(ordno,month,cid,aid,pid,qty,money)
as
select OX.ordno,OX.month,OX.cid,OX.aid,OY.pid,OY.qty,OX.money
from OX,OY
where OX.ordno=OY.ordno;

作用四:对机密数据提供安全性保护
对于共享同一数据库的不同用户,可能不允许用户访问部分数据,通过定义不同的视图可以很好的解决改问题,从而提供了对数据的安全性保护。

例如,orders表中涉及各种产品的销售量、销售额以及所负责的代理商,商家可以对客户定义一个视图,只包含产品的销售量和代理商,方便客户了解产品信息选择合适的代理商同时隐藏产品的报价。

视图的缺点

1.性能差
视图是定义在基本表之上的,对视图的一切操作最终也要转化为对基本表的操作,在这个转化过程中,数据库可能会花费一定的操作,尤其是当视图是在其他视图基础上创建的。

2.修改限制
当用户试图通过视图修改某些信息时,数据库会转化为对基本表的修改,而由于视图的定义等原因,修改容易出错。
同时,当基本表的结构改变时,视图的定义常常也需要改变。

视图的更新规定

DB2规定,在下列情况下,视图不允许更新:

1.视图由两个以上基本表导出
2.视图的字段来自字段表达式或常数,则不允许INSERTUPDATE,但允许DELETE
3.视图的字段来自聚集函数
4.视图的定义中含有GROUP BY 或 DISTINCT
5.视图的定义中含有嵌套查询,且内层查询的FROM子句涉及的表也作为改视图的导出表

总结

学习笔记:视图的作用、缺点、更新的规定[附例讲解]_第1张图片
第一次写博客呀,欢迎大家指正~~
学习笔记:视图的作用、缺点、更新的规定[附例讲解]_第2张图片

你可能感兴趣的:(数据库,sql)