找出没有选修过“李明”老师讲授课程的所有学生姓名

Select S.Sno,S.Sname 
from S 
where Sno not in 
(select distinct( SC.Sno) 
from SC,C,T
where  SC.Cno=C.Cno and T.Tno=C.Tno and T.Tname='李明'); 
Select S.Sno,S.Sname 
from S 
where  not exists 
(select *
from SC,C,T
where  S.Sno=SC.Sno and SC.Cno=C.Cno and T.Tno=C.Tno and T.Tname='李明'); 

以上两种方法都是正确的。


类似于!= '李明' 的方法不可以。

因为如果一个学生同时选择了李明和张勇的课,虽然排除了选修的李明的课,但因为该生选修有张勇的课,该学生仍旧会在结果记录中。
很明显,这个同学也选了李明的课,不符合题目条件。
同样道理,类似的解法都不对。
这样的方法只是排除了只选修了李明老师课的同学。
错误1:
Select S.Sno,S.Sname 
from S 
where Sno  in 
(select distinct( SC.Sno) 
from SC,C,T
where  SC.Cno=C.Cno and T.Tno=C.Tno and T.Tname!='李明'); 

错误2:

Select distinct S.Sno,S.Sname 
from S,SC,C,T
where  S.Sno=SC.Sno and SC.Cno=C.Cno and T.Tno=C.Tno and T.Tname!='李明'; 

 


附录1:建表语句
Create table S 
(Sno char(9) PRIMARY KEY,   
 Sname char(20),
 Sage int,   
 Ssex char(2))  
      
Create table T
(Tno char(5) PRIMARY KEY,    
 Tname char(20))               
          
Create table C
(Cno char(4) PRIMARY KEY,   
 Cname char(40),  
 Tno char(5),
 FOREIGN KEY(Tno) REFERENCES T(Tno))              
       
Create table SC
(Sno char(9),  
Cno char(4),  
Score int,
PRIMARY KEY (Sno,Cno),  
FOREIGN KEY(Sno) REFERENCES S(Sno),
FOREIGN KEY(Cno) REFERENCES C(Cno))

 附录2:测试数据

posted on 2017-06-29 16:34  HBU_DAVID  阅读(12256)  评论(0编辑  收藏  举报

导航