综合题
在上题的“学生-选课-课程”数据库中,它们的主码分别是Sno,(Sno,Cno),Cno,并且其他属性都允许为空值(NULL)。用下面的SQL语句创建了两个视图:
CREATE VIEW CS_S AS SELECT Sno,Sname,Sage
FROM S WHERE Sdept=‘计算机系’;
CREATE VIEW S_G( Sno,Gavg)AS SELECT Sno,avg(Grade)
FROM SC GROUP BY Sno ;
若用下面的SQL语句对上述视图进行修改,它们能被成功执行吗?为什么?
(1) UPDATE CS_S SET Sname ='王萍' WHERE Sno = 'S200500101';
(这里假定在表S中存在学号Sno = 'S200500101'的行)
(2) INSERT INTO CS_S VALUES('S200502189', '杨青', 21 ) ;
(这里假定在表S中不存在学号Sno = 'S200502189'的行)
(3) UPDATE S_G SET Gavg = 85 WHERE Sno = 'S200501001';
(这里假定在表SC中存在学号Sno = 'S200501001'的行)
要求:
首先回答这三个SQL语句中哪个(些)能被成功执行,哪个(些)不能被成功执行,再进一步说明能被成功执行或不能被成功执行的理由。(10分)
【正确答案】第(1)和(2)两个SQL语句能被成功执行;第(3)个SQL语句不能被成功执行。 因为对视图的修改最终要转换为对基本表的修改。(2分)
对于第(1)个SQL语句能被成功执行的理由是:执行这个SQL语句将转换成执行如下的SQL语句:
UPDATE S SET Sname ='王萍' WHERE Sdept=‘计算机系’AND Sno = 'S200500101';
(3分)
对于第(2)个SQL语句能被成功执行的理由是:执行这个SQL语句将转换成执行如下的SQL语句:
INSERT INTO S VALUES('S200502189', '杨青' , NULL, 21,'计算机系') ;
或INSERT INTO S (Sno,Sname,Sage ,Sdept )
VALUES('S200502189', '杨青' ,21,'计算机系');
转换后的这两个SQL语句,在本题意的假定下是能够被成功执行的。所以第(1)和(2)个SQL语句能被成功执行。(3分)
对于第(3)个SQL语句不能被成功执行的理由是:由于视图S_G中的一个行,是由表SC中若干行经过分组求平均值得到的,因此对视图S_G的更新就无法转换成对基本表SC的更新。所以第(3)个SQL语句不能被成功执行。(2分)