--1. 写出创建满足下述要求的视图的SQL语句,并执行所写代码。
--()包含学生的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
CREATE VIEW v1 AS SELECT Student.Sno,Sname,Sage,Sdept,SC.Cno,Cname,Credit
FROM student,SC,Course
WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno
--()包含学生的学号、姓名、选修的课程名和考试成绩的视图。
CREATE VIEW v2 AS SELECT Student.Sno,Sname,Cname,SC.Grade
from Student,SC,Course
where Student.Sno=SC.Sno and sc.Cno=Course.Cno;
--()统计每个学生的选课门数,要求列出学生学号和选课门数的视图。
create view v3 as select Sno '学号', COUNT(Cno) '选课门数' from SC group by Sno;
--()统计每个学生的修课总学分,要求列出学生学号和总学分的视图(说明:考试成绩大于等于才可获得此门课程的学分)。
m
create view v4 as select SC.Sno, sum(Credit) '总学分' from SC,Course Where SC.Cno=Course.Cno and Grade >=60 group by Sno
--2. 利用第题建立的视图,完成如下查询。
--()查询考试成绩大于等于分的学生的姓名、课程名和成绩。
select Sno,Cname,Grade from v2 where Grade >= 90;
--()查询选课门数超过门的学生的学号和选课门数。
select 学号,选课门数 from v3 where 选课门数>3;
--()查询计算机系选课门数超过门的学生的姓名和选课门数。
select Sname,选课门数 FROM Student,v3 WHERE v3.学号=Student.Sno AND Sdept='计算机系' AND 选课门数>3
--()查询修课总学分超过分的学生的学号、姓名、所在系和修课总学分。
select Student.Sno,Sname,Sdept,总学分 from v4,Student where Student.Sno=v4.Sno and 总学分>10
--()查询年龄大于等于岁的学生中,修课总学分超过分的学生的姓名、年龄、所在系和修课总学分。
select Sname,Sage,Sdept,总学分 from v4,Student where Sage>20 and Student.Sno=v4.Sno and v4.总学分>10;
--使用WITH CHECK OPTION,在第题建立的视图()的基础上,
--再创建一个“计算机系”同学的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
create view v5 as select Student.Sno,Sname,Sdept,Sage,SC.Cno,Cname,Credit
from Student,SC,Course
where Sdept='计算机系' and Student.Sno=SC.Sno and SC.Cno= Course.Cno with check option;
--()增加一条记录,
--0841101 ? 张新 ? 计算机系 ? 20 C001 高等数学 ? 4
INSERT INTO v5 VALUES(0841101,'张新','计算机系',20,'C001','高等数学',4);
--()修改这条记录为
--0841101 ? 张新 ? 物理系 ? 20 C001 高等数学 ? 4
update v5 set Sdept='物理系' where Sno='0841101';
--以上两个操作是否能够实现?为什么?可以实现的,写出SQL语句。
第一条语句不能实现因为他会涉及到多张表的值
--4.以下操作能否实现,如果能实现,给出相应的SQL语句,否则,解释不能实现的原因。
--()对Student表,创建一个只包含男生信息的视图。对此视图执行将“李勇”的年龄更新为岁。
CREATE view v6 as select * FROM Student where Sex='男';
UPDATE v6 SET Sage = 22 WHERE Sname = '李勇'
--()在上题创建的视图中。删除“刘晨”同学的记录。
DELETE from v6 WHERE Sname = '刘晨'
--DELETE 语句与REFERENCE 约束"FK__SC__Sno__0BC6C43E"冲突。该冲突发生于数据库"学生数据库",表"dbo.SC", column 'Sno'。
--()第题建立的“计算机系”同学的视图,对此视图执行将“李勇”的年龄更新为岁。
UPDATE v5 SET Sage=22 WHERE Sname='李勇'
--()第题建立的“计算机系”同学的视图,对此视图执行删除“刘晨”同学的记录。
DELETE from v5 WHERE Sname = '刘晨'
--视图或函数'v5' 不可更新,因为修改会影响多个基表
。