SQL视图
目录:1.三级模式两层映像结构和数据库结构
2.视图的定义和使用
3.视图在查询方面的使用
4.视图的更新
5.视图的撤销
1.三级模式两层映像结构
(1)对应概念模式(模式)的数据在SQL中被称为基本表
(2)对应外模式的数据称为视图(还包括外模式-模式(E-C)的映像)
2.SQL数据库结构
(1)基本表是实际存储在存储文件中的表,基本表中的数据是需要存储的
(2)视图在SQL中只存储其由基本表导出视图所需要的公式,即由基本表产生视图的映像信息,其数据并不存储,而是在运行过程中动态产生和维护的
(3)对视图数据的更改最终要反映在对基本表的更改上
3.视图定义
(1)语法格式
create view view_name [(列名[, 列名] ... )]
as 子查询 [ with check option]
(2)如果视图的属性名缺省,则默认为子查询结果中的属性名;也可以显式指明其所拥有的列名
(3)with check option 指明当对视图进行 insert, update, delete时,要进行 insert/update/delete的元组是否满足视图定义中子查询中定义的条件表达式
4.视图定义举例
(1)定义一个视图 CompStud 为计算机系的学生,通过该视图可以将 Student 表中其他系的同学屏蔽掉
Creat view CompStud
As ( Select * From Student Where D# in ( Select D# From Dept Where Dname = '计算机' ) );
(2)定义一个视图 Teach 为教师任课情况,把 Teacher 表中的个人隐私方面的信息,如个人薪资等屏蔽掉,仅反映其教那门课及其学分等
Creat view Teach
As ( Select T.Tname, C.Cname, Credit From Teacher T, Course C Where T.T# = C.T# );
5.视图使用(体现在查询方面)
定义好的视图,可以像 Table 一样,在SQL各种语句中使用
(1)检索主讲教师课程的教师姓名,我们可以使用Teach
Select Tname From Teach Where Cname = '数据库';
(2)检索计算机系的所有学生,我们可以使用 CompStud
Select * From CompStud;
(3)检索计算机系的年龄小于20的所有同学,我们可以使用 CompStud
Select * From CompStud Where Sage < 20;
(4)定义视图 StudStat,描述学生的平均成绩,最高成绩,最低成绩等
Creat view StudStat (S#, Sname, AvgS, MinS, MaxS, CNT)
As ( Select S#, Sname, AvgS(Score), MIN(Score), MAX(Score), Count(*)
From Student S, SC
Where S.S# = SC.S#
Group by S.S#);
(5)基于视图 StudStat 检索某一学生的平均成绩
Select AvgS From StudStat;
6.视图的更新
(1)因为视图不保存数据,对视图的更新最终要反应在对基本表的更新上,而有时,视图定义的映射是不可逆的
(2)视图更新问题:有些视图是可更新的,而有的是不可更新的
(3)举例
1)create view ClassStud(Sname, Sclass)
as (Select Sname, Sclass From Student);
操作:Insert into ClassStud
Values ('张三', '980301');
此操作无法更新,对视图 ClassStud 没有 S#,而S#是Student的主键
(4)视图能否更新的判断
1)如果视图的 Select 目标列包含聚集函数,不能更新
2)如果视图的 Select 子句使用了 unique 或 distinct ,不能更新
3)如果视图包含了 group by 子句,不能更新
4)如果视图中包括经算术表达式计算出来的列,不能更新
5)如果视图是由单个表的列构成,但没有主键,不能更新
6)对于由单一 Table 子集构成的视图,即如果视图是从单个基本表使用选择,投影操作导出的,并且包含了基本表的主键,则可以更新
7.视图的撤销
(1)撤销视图:Drop View view_name
(2)举例:Drop View Teach;
(3)撤销基本表:Drop Table 表名