第三章关系数据库标准语言SQL-第六、七节:视图

在这里插入图片描述

[toc]

一:关于视图

(1)什么视图

视图:视图是一个虚表,其本质就是一条SELECT语句,而查询结果被赋予了一个名字,也即视图名字。或者说视图本身不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化时,视图数据也随之变化。其目的就是在于方便,简化数据操作

(2)什么时候会用到视图

简单点说,当我们感觉查询语句太过复杂且不好操控时就可以创建视图,直接

SELECT * FROM [view]

(3)视图的作用

  • 视图能够简化用户的操作
  • 视图使用户能以多种角度看待同一数据
  • 视图对重构数据库提供了一定程度的逻辑独立性
  • 视图能够对机密数据提供安全保护
  • 适当的利用视图可以更清晰的表达查询

二:视图的定义和删除

(1)建立视图

语法:使用CREATE VIEW语句创建视图,格式如下在这里插入图片描述

  • 子查询可以是任意的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

演示

alt

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';

在这里插入图片描述

#考研##数据库#

数据库系统概论王珊第五版笔记

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-29 12:19
点赞 评论 收藏
分享
10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务