SQL数据库结构
(1)基本表是实际存储于存储文件中的表,基本表的数据是需要存储的。
(2)视图在SQL中只存储其由基本表导出视图所需要的公式,即由基本表所产生视图的映像信息,其数据并不存储,而实在运行的过程中进行动态产生和维护的。
(3)对视图数据的更改最终要反应在对基本表的更改上。
视图定义的格式
CREATE VIEW view_name [(列名[,列名]...)]
as 子查询[with check option]
#如果视图的属性名缺省,则默认为子查询结果中的属性名;
#也可以显示的指明其所拥有的列名。
#with check option指明当对视图进行insert,updata,delete的时候,要检查进行这些操作的元组是否满足视图定义中子查询中定义的条件的表达式
实例:定义一个视图CompStud为计算机系的学生,通过该视图可以将Student表中其他系的学生进行屏蔽掉。
#下面的select语句实际上为一个EC映像也就是怎么从基本表中导出这个视图。
Create View CompStud AS
(Select * From Student
Where D# in(Select D# From Dept
Where Dname= "计算机"));
实例:定义一个视图Teach为教师任课的情况,把Teacher表中的个人隐私方面的信息,如工资等屏蔽调,仅反映了其教授那门课以及其学分等。
Create View Teach AS
(Select T.Tname,C.Cname,Credit
From Teacher T,Courcse C
Where T.T# = C.T#
)
使用视图:定义好的视图可以像Table一样,在SQL各种语句中进行使用
实例:(1)检索教授数据库课程的教师的姓名可以用Teach
(2)检索计算机系所有的学生可以用CompStud
(3)检索计算机系年龄小于20的所有学生
Select T.Tname From Teach T
Where T.Cname = "数据库";
Select * From CompStud;
Select * From CompStud
Where Sage < 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#);
实例:基于视图StudStat检索某一个学生的平均成绩
Select Sname,AvgS From StudStat Where Sname = "zhangsan";
SQL视图的更新:是比较复杂的问题,因为视图不保存数据,对视图的更新最终要反应到对基本表的更欣赏,但是有的时候视图的定义的映射并不是可逆的。
create view S_G(S#,Savg)
as (select S#,AVG(Score)
from SC group by S#);
如果要进行如下的更新操作
update S_G
set Savg = 85
where S# = "98030101"
不可以更新,因为平均成绩无法反映到原本的表中。
实例:插入一条数据,如果没有主键也不会发生更新。因为缺少S#,而S#是Student的主键。
Create view ClassStud(Sname,Sclass)
as (select Sname,Sclass
from Student);
#执行以下操作
Insert into ClassStud
Values("zhangsan","0301")
SQL视图更新的可执行性:
(1)如果视图的select目标列包含聚集函数(求和、求平均之类的),则不能更新。
(2)如果视图的select子句使用了union或者distinct,则不能更新。
(3)如果视图中使用了group by子句,则不能更新。
(4)如果视图中包括经过算术表达式计算出来的列,则不能更新。
(5)如果视图由单个表的列构成,但是没有包含主键,则不能进行更新。
可以更新的:对于由单一Table子集构成的视图,如果视图是从耽搁基本表使用选择、投影操作导出出来的,而且包含了基本表的主键则可以进行更新。
视图的更新转换为对基本表的更新:缺失的位置会写上Null。