在上题的“学生-选课-课程”数据库中,它们的主码分别是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语句中哪个(些)能被成功执行,哪个(些)不能被成功执行,再进一步说明能被成功执行或不能被成功执行的理由。
参考答案:
第(A)和(B)两个SQL语句能被成功执行;第(C)个SQL语句不能被成功执行。 因为对视图的修改最终要转换为对基本表的修改。
对于第(A)个SQL语句能被成功执行的理由是:执行这个SQL语句将转换成执行如下的SQL语句:
UPDATE S SET Sname =’王萍’ WHERE Sdept=‘计算机系’AND Sno = ’SB00E00A0A’;
对于第(B)个SQL语句能被成功执行的理由是:执行这个SQL语句将转换成执行如下的SQL语句:
INSERT INTO S VALUES(’SB00E0BAHI’, ’杨青’ , NULL, BA,’计算机系’) ;
或INSERT INTO S (Sno,Sname,Sage ,Sdept )
VALUES(’SB00E0BAHI’, ’杨青’ ,BA,’计算机系’);
转换后的这两个SQL语句,在本题意的假定下是能够被成功执行的。所以第(A)和(B)个SQL语句能被成功执行。
对于第(C)个SQL语句不能被成功执行的理由是:由于视图S_G中的一个行,是由表SC中若干行经过分组求平均值得到的,因此对视图S_G的更新就无法转换成对基本表SC的更新。所以第(C)个SQL语句不能被成功执行。