文章目录
一、定义视图
CREATE VIEW <视图名> [列名,列名,列名]
AS
SELECT<子查询>
[WITH CHECK OPTION]
1、属性列名
- 要么全部省略或者全部指定
- 有三种情况必须明确指定组成视图的所有列名(目标列不是单纯的列名,有同名字段,在视图中启用新的名字)
2、WITH CHECK OPTION
对视图进行操作时,要保证满足子查询中的条件
3、例子
1)行列子集视图
视图是从单个基本表中导出的,去掉了基本表的某些行,但是保留了主码
CREATE VIEW IS_Student(Sno,Sname,Sage)
AS
SELECT Sno,Sname,Sage FROM Student
WHERE Sdept='IS';
1)建立在多个表上
建立信息系选修1号课程学生的视图
CREATE VIEW IS_SI[Sno,Sname,Grade]
ON
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno AND Sdepet='SI' AND SC.Cno='1';
2)带虚拟列的视图(带表达式的视图)
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2019-Sage
FROM Student
3)分组视图
带有聚集函数和GROUP BY的子句来查询定义视图
CREATE VIEW S_G(Sno,Gagv)
AS
SELECT Sno,AVG(Grade)
FROM SC
ORDER BY Sno
4)子查询SELECT*
子查询是由“SELECT*”建立的,F_Student的属性列和Student的属性列一一对应,如果Student表的结构改变,相当于破坏映像关系,该视图不能正常工作
CREATE VIEW F_Student(F_sno,name,sex,age,dept)
AS
SELECT *
FROM Student
WHERE Ssex='女';
二、删除视图
1、删除格式
基本表删除后,由基本表导出的视图均无法用了,但是视图的定义没有从字典中删除,删除视图需要显示的使用DROP VIEW 语句
DROP VIEW <视图名>[CASCADE]
2、级联删除
删除视图IS_S1和和由IS_S1导出的所有视图
DROP VIEW IS_S1 CASCADE
三、查询视图
1、视图消解(view resolution)
1)有效性检查
2)从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询
2、生成派生表
派生表只是在语句执行时临时定义,语句执行后该定义即被删除
SELECT *
FROM (SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno) AS S_G(Sno,Gavg)
WHERE Gavg>=90;
四、视图的作用
- 视图能够简化用户的操作
- 视图使得用户以多种角度看待同一数据
- 视图对重构数据库提供一定程度的逻辑独立性
- 视图能够对机密数据提供保护
- 适当利用视图可以清晰的表达查询