乐趣区

关于数据库:数据库系统概论王珊第三章关系数据库标准语言SQL第六七节视图

  • pdf 下载:明码 7281
  • 专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解

一:对于视图

(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

演示:

【例 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';
退出移动版