数据库系统原理实验报告6 | 视图

整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。

专业课本:

————

本次实验使用到的图形化工具:Heidisql

目录

一、实验目的

二、实验内容

1.根据EDUC数据库,按如下要求设计视图

1)基于单个表按投影操作定义视图。

2)基于单个表按选择操作定义视图。

3)基于多个表根据连接操作定义视图。

4)基于多个表根据嵌套查询定义视图。

5)定义含有虚字段(即基本表中原本不存在的字段)的视图。

2.根据EDUC数据库,分析如下问题:

1)举例说明,在定义的视图上进行查询、插入、更新和删除操作,分情况(查询、更新)讨论哪些操作可以成功完成,哪些不能成功完成,并分析原因。

2)举例说明,WITH CHECK OPTION语句的作用。

三、实验结果总结

四、实验结果的运用

1. 视图的作用

2. 用其它关系表(成绩表)创建视图的例子:

1)创建成绩视图score_view,包含学号sno,姓名sname,课程名cname,成绩degree

2)通过score_view视图把学号为108,课程号为6-166的成绩修改成99

3)创建一个数据库课程的学生名单视图s_view,包含学号sno,姓名sname,性别ssex 

4)通过s_view视图,把计算机导论课程的“刘晨”的性别改成“女” 

5)创建一个计算机导论课程的成绩单视图score_view_computer,包含学号sno,姓名sname,课程名cname,成绩degree

6)删除score_view_computer视图 

**补充:EDUC数据库



一、实验目的

1.通过实验理解视图的概念。

2.掌握视图的定义、查询、更新等操作。


二、实验内容

1.根据EDUC数据库,按如下要求设计视图

1)基于单个表按投影操作定义视图。

举例:定义一个视图用以查看所有学生的学号、姓名和年龄。

代码:

CREATE VIEW sno_sname_sage
AS
SELECT sno,sname,sage
FROM student

运行结果: 

2)基于单个表按选择操作定义视图。

举例:定义一个满足性别=‘男’的学生的所有信息的视图。

代码:

CREATE VIEW male_sno_sname_sage
AS
SELECT sno,sname,sage
FROM student
WHERE ssex='男';

运行结果: 

3)基于多个表根据连接操作定义视图。

举例:定义一个视图用以查看所有学生的学号、姓名、课名、成绩。

代码:

CREATE VIEW s_c_sc
AS
SELECT sc.Sno,sname,cname,grade
FROM student,course,sc
WHERE student.Sno=sc.Sno AND course.Cno=sc.Cno

运行结果: 

4)基于多个表根据嵌套查询定义视图。

举例1:定义一个比所有‘CS’系的学生年龄都小的学生的信息的视图

代码:

CREATE VIEW sage_cs
AS
SELECT sno,sname,sage
FROM student x
WHERE sage < (
	SELECT MIN(sage)
	FROM student y
	WHERE sdept='CS'
)

运行结果: 

举例2:定义一个视图用以查看年龄大于该系平均年龄的学生的学号、姓名。

代码:

CREATE VIEW sage_olderThan_avg
AS
SELECT sno,sname
FROM student X
WHERE sage>(
	SELECT AVG(sage)
	FROM student y
	WHERE x.Sdept=y.Sdept
)

运行结果: 

5)定义含有虚字段(即基本表中原本不存在的字段)的视图。

举例:定义一个视图用以查看所有学生的学号、姓名、出生年份。

代码:

CREATE VIEW sno_sname_birth(sno,sname,birth_year)
AS
SELECT sno,sname,2022-sage
FROM student

运行结果: 

2.根据EDUC数据库分析如下问题

1)举例说明,在定义的视图上进行查询、插入、更新和删除操作,分情况(查询、更新)讨论哪些操作可以成功完成,哪些不能成功完成,并分析原因。

a.没有添加WITH CHECK OPTION 时:

###查询视图
SELECT sno,sname,sage
FROM sno_sname_sage
WHERE sage>18;

###插入
INSERT 
INTO male_sno_sname_sage
VALUES('001','赵六',25);

实际上是插入到了student表中,视图里不显示。因为从视图中插入时,没有指定“赵六”的ssex为男,所以默认为null,无法显示。

###修改 将视图中所有人的年龄加一
UPDATE male_sno_sname_sage
SET sage=sage+1;

如图,在男生学生信息的视图中进行将视图内所有学生的年龄加一的操作,在student表中也只有三位男生的年龄增加了。可见在修改时,默认存在sex=‘男’这一条件

###删除   无法执行
DELETE 
FROM male_sno_sname_sage
WHERE sno='200215121'

当sc表上有外键关联student表时,由于参照完整性约束条件,sc表参照student表且对视图的操作实质上是对基本表的操作,因而对该视图删除sno时,系统检查完整性规则时发现被参照的属性sno不完整,故报错,该操作不能执行。

但当表内外键被删除时,操作即可执行:

如图,李勇的数据被删除了。可见删除时,默认存在sex=’男’这一条件。 

b.添加WITH CHECK OPTION 时:

CREATE VIEW male_sno_sname_sage
AS
SELECT sno,sname,sage
FROM student
WHERE ssex='男'
WITH CHECK OPTION 

创建一个带有check语句的视图,执行如上操作。

##插入
INSERT 
INTO male_sno_sname_sage
VALUES('001','赵六',25);

无法成功执行,出现如下错误:

这是由于带有check语句,在插入时会自动检查新增语句的ssex属性值是否为“男”,若满足要求,将成功插入;若不满足要求,则拒绝插入。在未指定“赵六”的ssex属性时,默认该属性值为null,不满足约束条件,因为无法成功插入。

当指定ssex属性改为“男”时,即可成功插入:

INSERT 
INTO student
VALUES('002','钱七','男',25,'art')

###修改 将视图中所有人的年龄加一
UPDATE male_sno_sname_sage
SET sage=sage+1;

###删除
DELETE 
FROM male_sno_sname_sag
WHERE sno='200215121'

由上述操作可知,修改与删除不受WITH CHECK OPTION的影响。只要语法正确以及符合完整性规范,即可成功执行。只有插入时with check option起作用。

2)举例说明,WITH CHECK OPTION语句的作用。

WITH CHECK OPTION表示对视图进行UPDATE INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

先创建一个带有check语句的视图,如:

CREATE VIEW male_sno_sname_sage
AS
SELECT sno,sname,sage
FROM student
WHERE ssex='男'
WITH CHECK OPTION 

由于在定义male_sno_sname_sage视图时加上了WITH CHECK OPTION语句,以后在对视图进行插入、删除或修改时,系统都会自动加上ssex=’男’的条件。插入时如果不符合条件(比如说插入ssex为’女’的字段或未指定ssex属性的字段),语句将不予执行。

如:

INSERT 
INTO male_sno_sname_sage
VALUES('001','赵六',25);

其中“赵六”未被指定性别属性,这时系统默认为seex  is  null,null不等于“男”,因而无法成功插入。如果该视图没有加上with check option ,则可以成功执行:

INSERT 
INTO male_sno_sname_sage
VALUES('001','赵六',25);

INSERT 
INTO student
VALUES('002','钱七','男',25,'art')

其中钱七的性别为“男”,符合条件,可以成功在数据库表中插入。

with check option 语句只对insert 操作有限制,删除、更新是没有限制的。如:

#修改 
UPDATE male_sno_sname_sage
SET sage=19;

#删除
DELETE 
FROM male_sno_sname_sage
WHERE sname='李勇'

 两条语句都能被成功地执行,在表中更改生效。


三、实验结果总结

1.创建CREATE   VIEW  AS  [WITH  CHECK  OPTION];

子查询就是一条查询语句,不允许包含ORDER BY和DISTINCT。视图实质上还是考察select查询的知识点。通过select,把查询出来的关系生成不同的视图。

2.查询 查询视图与查询基本表是一样的,select-from-where实现视图查询的方法是视图消解法,指的是系统对查询语句进行有效性检查,转换成等价的对基本表的查询,执行修正后的查询。多数关系数据库管理系统对行列子集视图的查询都可以正确转换,但是对于有一些复杂的语句,系统可能无法正确转换。

3.更新: 

同样包括增删改,其中WITH CHECK OPTION 可以对插入的数据进行检查,如果没有,则可以插入任意的数据。如果有,则不许云插入视图范围之外的数据。(不管是否有WITH CHECK OPTION,修改、删除、查询都是一样的。只有插入操作不同。)而且一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。

对视图的更新实质上还是对基本表的更新,如果基本表上已经有一些约束条件或完整性约束,对视图的更新将受到影响。比如原表中有外键或主键,那么即使在视图中进行涉及到该元组的删除和修改,也是不被允许的。

4.删除: DROP  VIEW

如果该视图上还导出了其他视图,在MySQL中只删除这个视图,由它导出的视图还存在但是已经失效。在删除视图时是没有cascade选项的。

注意基本表中的各种约束。在进行增删改查时系统会自动进行完整性约束的检查,如果不符合,将不被执行。


四、实验结果的运用

1. 视图的作用

1. 视图能够简化用户(程序员)的操作

2. 视图使用户(程序员)能以多种角度看待同一数据

3. 视图对重构数据库提供了一定程度的逻辑独立性

4. 视图能够对机密数据提供安全保护

5. 适当的利用视图可以更清晰的表达查询

2. 用其它关系表(成绩表)创建视图的例子:

1)创建成绩视图score_view,包含学号sno,姓名sname,课程名cname,成绩degree

create view score_view as
select s.sno,st.sname,c.cname,s.degree from score s
inner join student st on s.sno=st.Sno
inner join course c on s.cno=c.cno

2)通过score_view视图把学号为108,课程号为6-166的成绩修改成99

update score_view set degree=99 where cno='6-166' and sno=108

3)创建一个数据库课程的学生名单视图s_view,包含学号sno,姓名sname,性别ssex 

create view s_view as select sno,sname,ssex from student
where cname=’数据库系统概论’

4)通过s_view视图,把计算机导论课程的“刘晨”的性别改成“女” 

update s_view set ssex='女' where sname='刘晨'

5)创建一个计算机导论课程的成绩单视图score_view_computer,包含学号sno,姓名sname,课程名cname,成绩degree

create view score_view_computer as
select s.sno,st.sname,c.cname,s.degree 
from score,s
where s.sno=st.Sno and s.cno=c.cno

6)删除score_view_computer视图 

drop view score_view_computer

**补充:EDUC数据库

建库建表源码:

create database educ;
use educ;
CREATE TABLE Student
(
Sno CHAR(9) NOT NULL PRIMARY KEY,
Sname CHAR(20),
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);

CREATE TABLE Course
(
Cno CHAR(4) NOT NULL PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);

CREATE TABLE SC
(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

INSERT INTO Student VALUES('200215121','李勇','男',20,'CS');
INSERT INTO Student VALUES('200215122','刘晨','女',19,'CS');
INSERT INTO Student VALUES('200215123','王敏','女',18,'MA');
INSERT INTO Student VALUES('200215125','张立','男',19,'IS');
INSERT INTO Student VALUES('200215124','张立','男',19,'IS');

INSERT INTO Course VALUES('2','数学',null,2);
INSERT INTO Course VALUES('6','数据处理',null,2);
INSERT INTO Course VALUES('7','pascal语言','6',4);
INSERT INTO Course VALUES('5','数据结构','7',4);
INSERT INTO Course VALUES('4','操作系统','6',3);
INSERT INTO Course VALUES('1','数据库','5',4);
INSERT INTO Course VALUES('3','信息系统','1',4);

INSERT INTO SC VALUES('200215121','1',92);
INSERT INTO SC VALUES('200215121','2',85);
INSERT INTO SC VALUES('200215121','3',88);
INSERT INTO SC VALUES('200215122','2',90);
INSERT INTO SC VALUES('200215122','3',80);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645878.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab中函数或变量 ‘eeglab‘ 无法识别

EEGLAB 没有安装或添加到 MATLAB 路径中&#xff1a; 确保已经安装了 EEGLAB&#xff0c;并且将其添加到 MATLAB 的路径中。您可以通过在 MATLAB 命令窗口中运行 which eeglab 来检查是否能够找到 EEGLAB。 EEGLAB 函数路径设置错误&#xff1a; 如果已经安装了 EEGLAB&#x…

信息系统项目管理师0131:输出(8项目整合管理—8.7监控项目工作—8.7.3输出)

点击查看专栏目录 文章目录 8.7.3 输出8.7.3 输出 工作绩效报告工作绩效信息可以用实体或电子形式加以合并、记录和分发。基于工作绩效信息,以实体或电子形式编制形成工作绩效报告,以制定决策、采取行动或引起关注。根据项目沟通管理计划,通过沟通过程向项目干系人发送工作绩…

Top期刊:针对论文Figure图片的7个改进建议

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 通过对来自细胞生物学、生理学和植物学领域的580篇论文&#xff0c;进行检查和归纳总结&#xff0c;来自德国德累斯顿工业大学的Helena Jambor及合作者&#xff0c;在PLOS Bio…

Linux网络编程:HTTPS协议

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

Linux-组管理和权限管理

1 Liunx组的基本介绍&#xff1a; 在Linux中的每个用户必须属于一个组&#xff0c;不能独立于组外。在Linux中每个文件都有所有者、所在组、其他组的概念 所有者所在组其它组改变用户所在的组 2 文件/目录的所有者 一般文件的创建者&#xff0c;谁创建了该文件&#xff0c;就…

Selenium 自动化测试工具<2>(Selenium 常用API的使用方法)

文章目录 浏览器操作浏览器最大化设置浏览器的大小浏览器的前进和后退操作浏览器滚动条 键盘事件单个按键用法键盘组合键用法 鼠标事件不同窗口搜索定位一组元素定位多层框架下拉框定位alert、confirm、prompt 的处理上传文件操作自动截屏 继上一篇文章对 Selenium API 的使用&…

【微机原理及接口技术】可编程并行接口芯片8255A

【微机原理及接口技术】可编程并行接口芯片8255A 文章目录 【微机原理及接口技术】可编程并行接口芯片8255A前言一、8255A的内部结构和引脚1.与外设接口&#xff08;数据端口&#xff09;2.与处理器接口 二、8255A的工作方式三、8255A的编程1. 写入方式控制字&#xff1a;控制字…

想转行程序员的朋友,有什么想问的在评论区随便问,我知道的都告诉你。

你想转行程序员吗&#xff1f; 我自己是法学院毕业后&#xff0c;通过2年的努力才转行程序员成功的。 我发现对于一个外行来说&#xff0c;找不到一个适合自己的方向&#xff0c;光靠努力在一个新的行业里成功异常艰难。即使你非常努力&#xff0c;但方向错了也会做大量的无用…

向npm发布自己写的vue组件,使用vite创建项目

向npm发布自己写的vue组件&#xff0c;使用vite创建项目 创建项目 pnpm create vite输入项目名称 由于我的组件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安装了下面4个。 然后执行 pnpm i安装依赖 vite.config.ts import { defineC…

太狠了,凌晨5点面试。。

(关注数据结构和算法&#xff0c;了解更多新知识) 网上看到一网友发文说收到面试邀请&#xff0c;面试时间竟然是早晨5点&#xff0c;这是要猝死的节奏。有的网友说应该是下午 5 点&#xff0c;如果是下午 5 点直接写下午 5 点就行了&#xff0c;或者写 17 点也行&#xff0c;直…

C语言系列文章 | 函数 (共 10209 字)

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 目录 函数的概念库函数自…

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

近期阅读论文

Exploring Hybrid Active-Passive RIS-Aided MEC Systems: From the Mode-Switching Perspective abstract 移动边缘计算&#xff08;MEC&#xff09;被认为是支持延迟敏感和计算密集型服务的有前途的技术。 然而&#xff0c;随机信道衰落特性导致的低卸载率成为制约MEC性能的…

Java 异步编程——Java内置线程调度器(Executor 框架)

文章目录 Java多线程的两级调度模型Executor 框架Executor 框架的组成概念Executor 框架中任务执行的两个阶段&#xff1a;任务提交和任务执行 在 Java1.5 以前&#xff0c;开发者必须手动实现自己的线程池&#xff1b;从 Java1.5 开始&#xff0c;Java 内部提供了线程池。 在J…

VMware虚拟机如何与主机共享文件夹

本机:WIN10 VMware虚拟机:WIN7 因为每次配置都爱忘记操作,目标是为了在WIN7虚拟机中可以访问本机文件 首先本机操作 新建一个共享文件夹,不带中文目录(最好不要) 点击共享 选择everyone,记得权限"读取和写入" 然后到虚拟机里面 添加一个网络位置 点击浏览,选择网…

C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;十一&#xff09;】 1、string&#xff08;重要知识点&#xff09;1.2、string的赋值和链接1.3、比较string1.4、子串1.5、交换string1.6、寻找string中的字符1.7、删除string中的字符1.8、替换string中的字符1.9、在str…

【C++】---多态

【C】---多态 一、多态的概念二、多态的定义及实现1、构成多态的2个必要条件2、什么叫做虚函数的重写&#xff1f;3、虚函数重写的3个例外4、建议把 析构函数 都定义为&#xff1a;虚函数 三、C11的两个关键字&#xff1a;final override1、final&#xff1a;修饰虚函数&#x…

k8s集群中pod的容器资源限制和三种探针

一、资源限制 总结&#xff1a; requests表示创建pod时预留的资源&#xff0c;limits表示pod能够使用资源的最大值。requests值可以被超&#xff0c;limits值不能超过&#xff0c;如果是内存使用超过limits会触发oom然后杀掉进程&#xff0c;如果是cpu超过limits会压缩cpu的使用…

Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

【Linux初探】:解锁开源世界的神秘钥匙

文章目录 &#x1f680;一、了解Linux&#x1f525;二、Linux 的发行版❤️三、Linux应用领域&#x1f4a5;四、Linux vs Windows & mac &#x1f680;一、了解Linux Linux是一种自由、开放源代码的操作系统&#xff0c;它的内核由芬兰计算机科学家Linus Torvalds在1991年创…