一:关于视图
(1)什么视图
视图:视图是一个虚表,其本质就是一条SELECT
语句,而查询结果被赋予了一个名字,也即视图名字。或者说视图本身不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化时,视图数据也随之变化。其目的就是在于方便,简化数据操作
(2)什么时候会用到视图
简单点说,当我们感觉查询语句太过复杂且不好操控时就可以创建视图,直接
SELECT * FROM [view]
(3)视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当的利用视图可以更清晰的表达查询
二:视图的定义和删除
(1)建立视图
- 子查询可以是任意的
SELECT
语句(是可以含有ORDER BY
子句和DISTINCT
短语取决于具体系统) - 组成视图的属性列名要么全部省略要么全部指定,不能有第三种情况
- 如果省略视图列名,则其列名默认由
SELECT
子句目标列诸字段组成
A:简单创建
演示:
【例1】建立信息系IS学生的视图
CREATE VIEW IS_student
AS
SELECT Sno,Sname,Sage,Sdept
FROM student
WHERE Sdept='IS'
B:基于多个基表的视图
演示:
【例2】建立计算机科学系选修了1号课程的学生视图
CREATE VIEW CS1
AS
SELECT student.Sno Sno,Sname,Grade
FROM student,sc
WHERE Sdept='CS' AND student.Sno=sc.Sno AND sc.Cno='1';
C:基于视图的视图
演示:
【例3】 建立计算机科学系选修了1号课程且成绩大于95分的学生的视图
CREATE VIEW CS2
AS
SELECT *
FROM CS1
WHERE Grade > 95;
D:带表达式的视图
演示:
【例4】定义一个反映学生出生年份的视图
CREATE VIEW birthday(Sno,Sname,Syear)
AS
SELECT Sno,Sname,2022-Sage
FROM student;
E:分组视图
- 带有聚集函数和
GROUP BY
演示:
【例5】将学生的学号及他的平均成绩定义为一个视图
CREATE VIEW stu_grade_avg(Sno,Savg)
AS
SELECT Sno,AVG(Grade)
FROM sc
GROUP BY Sno;
(2)删除视图
语法:格式如下,需要注意
- 基本表删除之后,由该基本表导出的所有视图均无法使用,但是视图的定义没有从字典中清除
三:视图的查询
语法:从用户角度出发,查询视图和查询基本表相同;从DBMS角度出发,采用视图消解法,具体来讲
- 首先进行有效性检查
- 接着转换成等价的对基本表的查询
- 最后执行修正后的查询
这里具体就不再做过多演示了,一般来说转换是能成功进行的,更多细节大家可以了解课本(这部分内容不多)
四:视图的更新
语法:视图是虚表,所以对视图的更新最终会转化为对基本表的更新。为了防止用户通过视图对数据进行更新时,有意或无意地对不属于视图范围内的基本表数据进行操作,可以在定义视图时加上WITH CHECK OPTION
子句。这样在更新时,如果不满足条件,DBMS会拒绝操作
(1)UPDATE
演示:
【例6】将信息系学生视图IS_Student
中学号201215125的学生姓名改为“刘辰”
UPDATE is_student
SET Sname='刘辰'
WHERE Sno='201215125';
【例7】如果在定义视图is_student
在定义时加入了WITH CHECK OPTION
子句,接着再执行【例6】需求
那么在更新时如果将Sdept
字段改为了'MA'或其他值,DBMS就会拒绝执行,并有下面的错误反馈
UPDATE is_student
SET Sdept='MA'
WHERE Sno='201215125';
如果在更新时只修改名字,那么就没有问题
UPDATE is_student
SET Sname='德玛'
WHERE Sno='201215125';
(2)INSERT
演示:
【例8】向信息系学生视图IS_Student
中插入一个新的学生记录:201215129,赵新,20岁
INSERT INTO is_student
VALUES('201215129','赵新',20);
- 这里视图没有数据,且20插入到了错误的地方(如果没有
WITH CHECK OPTION
就会导致这些错误出现) - 如果假如了
WITH CHECK OPTION
,那么DBMS会拒绝执行
(3)DELETE
- 删除数据时,有无
WITH CHECK OPTION
都是一样的
演示:
【例9】删除学号为201215125的学生
DELETE
FROM is_student
WHERE Sno='201215125';