前言:历时几天,总算把这个实验做出来了。此文章实验的题目、答案、解析3部分组成,包含实现这个实验的所有代码和问题的解析教程等。 说明:实验用的软件:SQL Server 2014版。
导入ScoreDB数据库,按照“实验2数据”,修改四张表内各个字段的类型以及宽度。完成后,实现以下操作:
ScoreDB的数据库源码可以到公众号【三桥君】回复【数据库实验二】领取。
以上相关的数据库源码可以到公众号【三桥君】回复【数据库实验二】领取。
说明:只挑部分较难的题目来分析 相关理论知识参考:数据库系统概论(基础篇)-笔记
4.查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名。
第一步:先在Score表中查询学号为“’0700001”选修的课程号;
第二步:再Score表中查询至少有一门课程号与第一步课程号相同的学生学号;
第三步:再Student表中查询与第二步学号相同的学生学号与姓名。
5.查询至少选修了学号为“0700001”学生所选修的所有课程的学生姓名。
暂时忘记怎么做了
6.查询本月过生日的学生信息。
MONTH(birthday)=MONTH(GETDATE())
表示生日=当月的信息
MONTH(birthday)=MONTH(GETDATE())+1
表示生日=当前下一月的信息
9.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩。
GROUP BY 需要与SELECT 的一致
平均成绩是原表中没有的属性,可以通过这个方式来创建。
17.查询所选修课程的成绩大于所有“002”号课程成绩的同学学号及相应课程的课程号和成绩。
如果成绩有空值的话,不能用ALL,要用MAX。
SELECT studentNo,courseNo,score
FROM Score
WHERE score >(SELECT MAX(score)
FROM Score
WHERE courseNo='002')
4.建立一个新的视图vw4,该视图包含学生姓名和年龄字段。将vw4中的年龄增加1岁。观察其运行结果并分析原因。
CREATE VIEW vw4(studentName,age)
AS
SELECT studentName,YEAR(GETDATE())-YEAR(birthday) age
FROM Student
UPDATE vw4
SET age=age+1
因为所创建的视图对其属性值进行了计算的其他形式上的改变,
而对视图的更改最终表现为对表的更改而表中不存在视图的某一属性,或属性的性质不相同,
则无法更改,这是一种视图机制。
而且在我们数据库中存在的vw4的数据有两个,只不过一个是基本表,一个是视图。
视图里的数据是从该Student基本表中得出的数据,如果要修改视图,就转化为对Student表的修改,
但是在Student表中并没有age这列属性,所以无法更改。
解决办法是重新创建一个基本表vw5,结构内容都一样的,然后把vw4视图的数据添加到vw5基本表中,就可以修改年龄了。
CREATE TABLE vw5(
studentName VARCHAR(20) NOT NULL,
age VARCHAR(20)
)
INSERT INTO vw5
SELECT *
FROM vw4
UPDATE vw5
SET age=age+1