三级模式两层映像:对应概念模式的数据在SQL中被称为基本表,而对应外模式的数据称为视图。视图不仅包含外模式,而且包含E-C映像。
SQL数据库结构:
1)基本表是实际存储文件的表,基本表中的数据时需要存储的。
2)视图在SQL中只存储其由基本表导出视图的所有公式,即由基本表产生视图的映像信息。视图并不存储数据。
3)对视图数据的更改最终要反映在对基本表的更改上。
1.定义视图
Create View view_name 列名1[...]
as (子查询[with check option]);
如果视图的属性名缺省,则默认为子查询结果中的属性名,否则就是指出的列名。
with check option是指:当视图包含insert,updata语句,delete语句时,要检查进行:insert/updata/delete的元组是否,满足视图中定义的子查询定义的约束条件。
例:定义一个视图为Compstud为计算机系的学生。
select View Compstu AS (select * From student where D# in(select D# From Dept where Dname=‘计算机‘);
2.使用视图:定义好的视图可以像table一样在SQL语言中使用。
例:查询计算机系所有的学生
select * From Comp stud;
例:检索计算机系年龄小于20的同学
select * From Compstud where age<20;
例;定义视图Studstat描述学生信息,平均成绩,最高成绩,最低成绩等等
Create View Studstat (S#,Sname,AVGS,MINS,MAXS,CNT) as (select S#,Sname,AVG(score),Min(score),Max(score),count(*) From student S,SC where S.S#=SC.S# Group by S.S#);
3.SQL视图的更新:由于视图不保存数据,对视图的更新最终要反映在对基本表的更新,但是有时候视图定义的映射不可逆。
SQL语言视图更新的规则:
1)如果视图的select的目标包含了聚集函数,则不可以更新。
2)如果视图中的select使用了unique或者distiinc,则不可以更新。
3)如果视图中包含了Group by语句,则不可以更新。
4)如果视图中包含了算数表达式,则不可以更新
5)如果视图是由单个表的列构成的,但是视图没有包含主键,则不可以更新。
对于单一table子集形成的视图,且包含主键属性,那么视图可以更新。
4.视图的撤销: Drop View view_name
例:撤销视图Compstud
Drop View Compdtud;