求出选修了所有课程的学生姓名

 求出选修了所有课程的学生姓名

学生表 S(SNO int pk,SN varchar(8))  --SNO为学号 ,SN为学生姓名。
课程表 C(CNO int pk,CN varchar(50)) --CNO为课程号,CN为课程名
选修表 SC(SNO int pk,CNO int pk,SCORE number(7,2),fk(SNO,CNO) )  --SCORE为成绩。

--以下语句为求出选修了所有课程的学生姓名.

  
  
  
  
  1. SELECT SN 
  2. FROM s 
  3. WHERE (NOT EXISTS 
  4.           (SELECT * 
  5.          FROM c 
  6.          WHERE NOT EXISTS 
  7.                    (SELECT * 
  8.                   FROM sc 
  9.                   WHERE SNO = S.SNO AND CNO = C.CNO))); 

解释:没有任何一门课程不再该生所选的课程中。

小朋友不会原因是不知道字段的访问规则,join 的查询中后面的表可以用前面表中的字段作为条件。在嵌套查询中子查询可以使用父查询表中的字段作为条件。

类似的题型还有:

1、求至少选修了学生学号为S003所选修的所有课程的学生姓名和学号。


  
  
  
  
  1.  SELECT distinct SN,SNo 
  2. FROM SC SC2 
  3. WHERE (NOT EXISTS 
  4.           (SELECT CNO 
  5.          FROM SC SC1 `
  6.          WHERE  SNO='S003' and CNO not in 
  7.                    (select Cno from Sc where SC2.SNO=Sc.SNo))); 

解释:

     没有任何一门学号为S003学生所选修的课程编号不在该生所选的课程的编号中中。

注意此处该生与S003不是同一个意思。该生泛指符合条件的学生。

 

你可能感兴趣的:(sql,职场,休闲)