关系(relations)
三种类型关系
表(table)-基表,存储关系(base tables,stored relations)
-用cerate table语句创建
-真实地存在于数据库中
-数据是持久的
视图(views)-虚拟关系(virtual relations)
不是物理存在的,是虚拟的
临时结果(temporary results)-用于构建子查询的结果
SQL支持数据库的三级模式结构
视图的特点
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不会出现数剧冗余
基表中的数据发生变化,从视图中查询出的数据也随之改变
基于视图的操作
定于视图(DDL)
-建立
-定于基于该视图的新视图
-删除
查询视图(DML)
更新视图(DML)(因为视图不真正存放数据,所以不提倡直接更新视图)
1.定义视图
(1)建立视图
create view<视图名>[(列名),[,<列名>]...)]
as<子查询>
[with check option];
组成视图的属性列名或全部省略或全部指定
省略视图的各个属性列名,则隐含改视图由子查询select句目标列中的各字段组成。
必须明确指定组成视图的所有列名的情形
-某个目标列不是单纯的属性名,而是集函数或列表达式
-目标列为*
-多表连接时选出了几个同名作为视图的字段
-需要在视图中为某个列启用新的更合适的名字
DBMS执行create view语句时只是把视图的定义传入数据字典,并不执行其中select语句
只是在对视图查询是,才按视图的定义从基本表中将数据查出
-视图定义的SELECT语句
不能包含ORDER BY子句和DISTINCT短语
wite check option
透过视图进行增删改操作时,不得破坏视图定义中的谓词条件
(即子查询中的条件表达式)
常见的视图形式
1.行列子集视图
2.WITH CHECK OPTION的视图
3.基于多个基表的视图
4.基于视图的视图
5.带表达式的视图
6.分组视图
1.行列子集视图
-从单个基本表导出
-只是去掉了基本表的某些行和某些列,但保留了码
2.with check option
在查询语句之后加上with check option,在更新时一定要符合where中的条件,才能更新该表
3.基于多个基表的视图
一个视图中需要用到多个视图
4.基于视图的视图
会用到其他视图的视图
5.带表达式的视图(一定要给表起新的名字)
会使用到表达式的视图
6.分组视图
用带集函数和GROUP BY子句的查询来定义的视图称为分组视图
分组视图必须明确定义组成视图的各个属性列名
以select*方式创建的视图
-可扩充性差,应尽可能避免
修改基表Student的结构后,Student表与V_Student1视图的映象关洗被破坏,导致该视图不能正确工作。
(2)删除视图
语句格式
drop view<视图名>
-该语句从数据字典中删除指定的视图定义
-由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除
-删除基表时,由该基表导出的所有视图定义都必须显式删除
2查询视图
从用户角度而言,查询视图与查询基本表的方法相同
视图实体化法(View Materialization)
进行有效性检查,检查所查询的视图是否存在。如果存在,则从数据字典中取出视图的定义
执行视图定义,将视图临时实体化,生成临时表·
将查询视图转换为查询临时表
查询完毕删除被实体化的视图(临时表)
视图消解法(View Resolution)
进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义
把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询
执行修正后的查询
更新视图
从用户角度而言,更新视图与更新基本表的方法相同
DBMS实现视图更新的方法
视图实体化法(View Materialization)
视图消解法( View Resolution)
定义视图时指定WITH CHECK OPTION子句后,DBMS在更新视图时会进行检查,防止用户通过视图对数据进行增加、删除、修改时,操作不属于视图范围内的基本表数据
DBMS对视图更新的限制
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新(对两类方法均如此)
视图的可更新性
行列子集视图是可更新的。(form只有一个表,包含原表主键的)
除行列子集视图外,还有些视图理论上是可更新的,但它们的确切特征还是尚待研究的课题。
还有些视图从理论上是不可更新的。
不可更新的视图与不允许更新的视图是两个不同的概念
实际系统对视图更新的限制
允许对行列子集视图进行更新
对其他类型视图的更新不同系统有不同限制
视图的作用
视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。
对于非行列子集视图进行查询或更新时还有可能出现问题。
合理使用视图能够带来许多好处
1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护