1、实验目的
熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。
2、实验内容及要求
针对给定的数据库模式以及相应的应用需求,创建视图和带WITH CHECK OPTION的视图,并验证视图WICH CHECK OPTION选项的有效性。
3、实验步骤
(1)利用课本P45-46 页建立的Student、Course和SC表,写出创建满足下列要求的视图的SQL语句。
①查询学生的学号、姓名、所在系、课程号、课程名、课程学分。
/*创建视图IS_Student_One*/
CREATE VIEW IS_Student_One(学号,姓名,所在系,课程号,课程名,课程学分)
AS
SELECT SC.Sno, Sname, Sdept, SC.Cno, Cname, Ccredit
FROM Student, Course, SC
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno
WITH CHECK OPTION;
/*查询视图IS_Student_One*/
SELECT * FROM IS_Student_One
②查询学生的学号、姓名、选修课程名和考试成绩。
/*创建视图IS_Student_Two*/
CREATE VIEW IS_Student_Two(学号,姓名,选修课程名,考试成绩)
AS
SELECT SC.Sno, Sname, Cname, Grade
FROM Student, Course, SC
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno
WITH CHECK OPTION
/*查询视图IS_Student_Two*/
SELECT * FROM IS_Student_Two
③统计每个学生的选课门数的视图,要求列出学生学号和选课门数。
/*创建视图IS_Student_Three*/
CREATE VIEW IS_Student_Three(学号,选课门数)
AS
SELECT Sno, COUNT(Cno)
FROM SC
GROUP BY Sno
WITH CHECK OPTION;
/*查询视图IS_Student_Three*/
SELECT * FROM IS_Student_Three
④统计每个学生的修课总学分的视图,要求列出学生学号和总学分(说明:考试成绩大于等于60才可获得此门课程的学分)。
/*创建视图IS_Student_Four*/
CREATE VIEW IS_Student_Four(学号,总学分)
AS
SELECT Sno, SUM(Ccredit)
FROM SC, Course
WHERE SC.Cno = Course.Cno AND Grade >= 60
GROUP BY Sno
WITH CHECK OPTION;
/*查询视图IS_Student_Four*/
SELECT * FROM IS_Student_Four
(2)利用第(1)题建立的视图,完成如下查询:
①查询考试成绩大于等于90分的学生的姓名、课程名和成绩。
/*对IS_Student_Two视图进行查询*/
SELECT 姓名, 选修课程名 AS 课程名, 考试成绩 AS 成绩
FROM IS_Student_Two
WHERE 考试成绩 >= 90
②查询选课门数超过3门的学生的学号和选课门数。
/*对IS_Student_Three视图进行查询*/
SELECT 学号, 选课门数
FROM IS_Student_Three
WHERE 选课门数 > 3
③查询计算机系选课门数超过3门的学生的姓名和选课门数。
/*对IS_Student_One和IS_Student_Three视图进行查询*/
SELECT DISTINCT 姓名, 选课门数
FROM IS_Student_One, IS_Student_Three
WHERE IS_Student_One.学号 = IS_Student_Three.学号 AND 选课门数 > 3 AND 所在系 = '计算机系'
④查询修课总学分超过10分的学生的学号、姓名、所在系和修课总学分。
/*对IS_Student_One和IS_Student_Four视图进行查询*/
SELECT DISTINCT IS_Student_One.学号, 姓名, 所在系, 总学分 as 修课总学分
FROM IS_Student_One, IS_Student_Four
WHERE IS_Student_One.学号 = IS_Student_Four.学号 AND 总学分 > 10
⑤查询年龄大于等于20岁的学生中,修课总学分超过10分的学生的姓名、年龄、所在系和修课总学分。4、1
/*查询Student、IS_Student_One和IS_Student_Four*/
SELECT DISTINCT 姓名, Sage, 所在系, 总学分 AS 修课总学分
FROM Student, IS_Student_One, IS_Student_Four
WHERE Student.Sno = IS_Student_One.学号 AND
IS_Student_One.学号 = IS_Student_Four.学号 AND
Sage >= 20 AND 总学分 > 10
(3)修改第(1)题④定义的视图,使其能查询每个学生的学号、总学分以及总的选课门数。
/*学号、总学分以及总的选课门数*/
ALTER VIEW IS_Student_Four(学号, 总学分, 总的选课门数)
AS
SELECT Sno, SUM(Ccredit), COUNT(SC.Cno)
FROM SC, Course
WHERE SC.Cno = Course.Cno
GROUP BY Sno
WITH CHECK OPTION;
/*查询修改后的IS_Student_Four*/
SELECT * FROM IS_Student_Four
o(〃^▽^〃)o小唠叨
今天老师布置啦数据库实验四,有很多实验结果图我就不放上来啦,别问为什么,问就是太多啦懒得一个一个上传啦
噢,对啦,这里还有一个坑没填,就是“并验证视图WICH CHECK OPTION选项的有效性”这个部分木有验证,先标记一下!!!
By 朱帅Esther~~~
2020.5.16上午 填坑WITH CHECK OPTION验证
参考啦大佬的博客https://blog.csdn.net/weixin_43753311/article/details/105923399?utm_source=app
还是老规矩,截图我就不放啦(*≧︶≦))( ̄▽ ̄* )ゞ
1、创建一个新的视图WithCheckOption_Test
/*创建视图视图WithCheckOption_Test*/
CREATE VIEW WithCheckOption_Test(学号,姓名,年龄)
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sage <= '19'
WITH CHECK OPTION;
2、查询视图
/*查询视图*/
SELECT * FROM WithCheckOption_Test
3、插入数据
/*插入一个年龄<=19的数据显示成功插入*/
INSERT INTO WithCheckOption_Test VALUES('1512020', 'ZHL', 17)
/*插入一个年龄>19的数据显示插入失败*/
INSERT INTO WithCheckOption_Test VALUES('1512021', '朱帅Esther', 21)
好啦,就这样!溜溜球~~