查询使用的数据库文件下载
1. 视图介绍
- 虚关系
- 并不预先计算并存储关系,而是在使用虚关系时才通过执行查询被计算出来 (概念上包含查询的结果)
- 任何不是逻辑模型的一部分,但作为虚关系对用户可见的关系称为视图(view)
- 一旦定义了一个视图,就可以使用视图名来指代该视图生成的需关系 (视图名可以出现在关系名可以出现的任何地方) (Once a view is defined, the view name can be used to refer to the virtual relation that the view generates);
- 在查询中,视图名可以出现在关系名可以出现的任何地方
- 视图实现
- 当定义一个视图是,数据库系统存储视图的定义本身,而不存储定义该视图的查询表达式的执行结果;
- 如果一个视图关系被计算并存储,一旦用于定义该视图的关系被修改,视图就会过期;
- 一旦视图出现在查询中,它就被已存储的查询表达式代替,故无论何时执行查询,视图关系都被重新计算;
- 一个视图可能被用到定义另一个视图的表达式中
- A view relation v_1 is said to depend directly on a view relation v_2 if v_2 is used in the expression defining v_1.
- A view relation v_1 is said to depend on view relation v_2 if either v_1 depends directly to v_2 or there is a path of dependencies from v_1 to v_2.
- A view relation v is said to be recursive if it depends on itself
- 物化视图(materialized view)***:
- 特定数据库系统允许存储视图关系,但它们保证:如果用于定义视图的实际关系改变,视图也跟着修改,这样的视图被称作物化视图
- 保持物化视图一直正在最新状态的过程称为物化视图维护(materialized view maintenance),简称视图维护
- 频繁使用视图的应用将会从视图的物化中获益,那些需要快速响应基于大关系上聚集计算的特定查询也会从创建与查询相对应的物化视图中受益良多 (避免了读取大的底层关系)
2. 视图定义
- create view v as <query expression>
- create view view_name(A_1,A_2,…,A_n) as <query expression>
- 例子:
- 对于只能访问instructor关系除salary之外的所有数据的职员,不能授予访问instructor关系的权限,因此可以定义一个视图提供给职员:
create view faculty as
select ID,name,dept_name
from instructor
3. 视图更新
使用视图来表达数据库修改(更新、插入或删除)必须被翻译为对数据库逻辑模型中实际关系的修改:
例如,如下插入必须表示为对instructor关系的插入
insert into faculty values('30765','Green','Music')
如何处理:
拒绝插入,返回错误信息;
插入(‘30765’, ‘Green’, ‘Music’, null)到instructor中
又如,
create view instructor_info as
select ID,name,building
from instructor,department
where instructor.dept_name = department.dept_name;
insert into instructor_info values ('69987','White','Taylar')
假设没有标识为69987的教师与位于Taylor楼的系,则向instructor与department关系插入元祖的唯一可能方法为:分别插入(‘69987’, ‘White’, null, null)、(‘null’, Taylor, null),然而这一更新并未产生出所需结果。因此,通过利用空值来更新instructor与department以得到instructor所需更新不可行。
除了一些有限的情况外,一般不允许对视图关系进行修改。
一般来说,如果定义视图的查询对下列条件都能满足,称SQL
视图是可更新的:
-
from 子句只有一个数据库关系;
-
select 子句只包含关系的属性名,不包含任何表达式、聚集或distinct声明;
-
任何没有出现在select子句中的属性可以取空值:即这些属性上没有not null约束,也不构成主码的一部分;
-
查询中不含有 group by 或 having 子句;
即使可更新,也依然会存在某些问题。
References:
[1] Abraham Silberschatz, Henry F Korth, S Sudarshan. Database System Concepts. New York: McGraw-Hill, 2010
Database System Concepts