在某些情况,让所有用户看到整个逻辑模型是不合适的
考虑一个职员需要知道教师的表示,姓名和所在系名,但是没有权限看到教师的工资值。此人就应该看到的关系由如下SQL语句所描述:
select name,department
from instructor
视图就提供了这种机制:向用户隐藏特定的数据
SQL允许通过查询来定义“虚关系”,它在概念上包含查询的结果,但不预先计算并存储。像这种作为虚关系对用户可见的关系称为***视图(view)***
在SQL中,我们用create view命令定义视图,命令的格式为:
create view v <query expression>
-- 可以是任何合法的查询表达式
-- v表示视图名
-- 使用视图的目的:安全及易于使用
--对应的,删除视图,使用命令:drop view v
例,重新考虑西药房分instructor关系中除salary之外的所有数据,此视图的定义如下:
create view faculty as
select ID,name,dept_name
from instructor
视图的属性名也可以按照下述方式显式指定
例,列出每个系中所有教师的工资总和
create view departments_total_salary(dept_name,total_salary) as
select dept_name,sum(salary)
from instructor
group by dept_name;
当我们定义一个视图时,数据库系统存储视图定义的本身,而不存储定义该视图的查询表达式的执行结果。
一旦定义了一个视图,就可以用视图名指代该视图生成的虚关系。由于数据库只存储视图定义本身,那么当视图关系出现在查询中时,它就会被已存储的查询表达式代替。
例,使用physics_fall_2009,找到所有于2009年球季学期在Watson大楼开设的Physics课程
select course_id,room_number
from physics_fall_2009 --此处视图在执行时会被对应select语句代替
where building = 'Watson';
假设我们向视图faculty插入一条新元组,可写为:
insert into faculty values("30765","Green","Music")
但这个插入必须表示为对关系instructor关系的插入,即必须给出salary的值。存在两种合理的解决方法:
通过视图修改数据库的另一类问题发生在这样的视图:
create view instructor_info as
select ID,name,building
from instrutor,department
where instructor.dept_name = department_name;
这个视图列出了大学里每个教师的ID,name和建筑名。若执行以下视图插入:
insert into insrtuctor_info values ("69987","White","Taylor");
一般地,如果定义视图的查询对下列条件能满足,我们称SQL视图是可更新的(updatable),即视图上可以执行插入,更新或删除
物化视图(materialized view):特定数据库系统允许存储视图关系,但是他们保证,如果用于定义的视图的实际关系改变,视图也跟着修改
物化视图维护:通常简称视图维护,保持物化视图一直在最新状态的过程。视图维护的三种方法:
我们用***create index***命令,为关系中的某些属性创建索引,它允许数据库系统高效的找到关系中那些在索引属性上取得给定值的元组,而不用扫描关系中的所有元组。
CREATE INDEX on ();
--例子
CREATE INDEX ins_index on instructor(ID);
我们用***create unique index***命令,为关系中的某些属性创建唯一索引
CREATE UNIQUE INDEX uni_stu_index on student(ID);
我们用***drop index***命令,删除一个索引