Student(S#,Sname,Sage,Ssex) 学生表     
Course(C#,Cname,T#) 课程表     
SC(S#,C#,score) 成绩表     
Teacher(T#,Tname) 教师表 
问:查询没有学全所有课的同学的学号、姓名
下面是我的,我总感觉应该还有一条更好的select st.sno,sname
from student st ,sc
where st.sno=sc.sno
group by sno
having count(sc.cno) <> ( select count(1) from course)   

解决方案 »

  1.   

    group by sno 去掉,看能执行不?
      

  2.   

    select st.sno,sname
    from student st ,sc
    where st.sno=sc.sno
    group by sno
    --个人觉得加个distinct比较好 
    having count(distinct sc.cno) <> ( select count(1) from course) 
      

  3.   


    select x1.s#,x1.name from(
    select x.s# learned from 学生表 x inner join 成绩表 c on x.s#=c.s# j 
       inner join 课程表 k on k.c#=c.c# group by s# having count(*)>(select count(1)
        from 课程表 group by c# )t inner join 学生表 x1 x1.s#=x.s#
    --好像有比你的还麻烦!
      

  4.   


    select st.sno,sname
    from student st 
    where st.sno in (select sc.sno from sc group by sno
    having count(sc.cno) <> ( select count(1) from course)) 这样子是不是更好点
      

  5.   

    select * from 
    (
    select * from student ,course
    ) a 
    where not exists(select 1 from sc b where a.s#=b.s# and a.c#=b.c#)
      

  6.   

    引用 5 楼 limeon 的回复:
    SQL codeselect st.sno,sname
    from student st
    where st.sno in (select sc.sno from sc group by sno
    having count(sc.cno) <> ( select count(1) from course))
    这样子是不是更好点
    ---
      

  7.   

    题目1 
      问题描述: 
      为管理岗位业务培训信息,建立3个表: 
      S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄 
      C (C#,CN ) C#,CN 分别代表课程编号、课程名称 
      SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩 
      
    1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 
    --实现代码: 
      SELECT SN,SD FROM S 
      WHERE [S#] IN( 
      SELECT [S#] FROM C,SC 
      WHERE C.[C#]=SC.[C#] 
      AND CN=N'税收基础') 
      
    2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位 
    --实现代码: 
      SELECT S.SN,S.SD FROM S,SC 
      WHERE S.[S#]=SC.[S#] 
      AND SC.[C#]='C2' 
     
    3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位 
    --实现代码: 
      SELECT SN,SD FROM S 
      WHERE [S#] NOT IN( 
      SELECT [S#] FROM SC 
      WHERE [C#]='C5') 
     
    4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位 
    --实现代码: 
      SELECT SN,SD FROM S 
      WHERE [S#] IN( 
      SELECT [S#] FROM SC 
      RIGHT JOIN 
      C ON SC. [C#] =C. [C#] GROUP BY [S#] 
      HAVING COUNT (*) =COUNT ([S#])) 
     
    5. 查询选修了课程的学员人数 
    --实现代码: 
      SELECT 学员人数=COUNT(DISTINCT [S#]) FROM SC   6. 查询选修课程超过5门的学员学号和所属单位 
      --实现代码: 
      SELECT SN, SD FROM S 
      WHERE [S#] IN ( 
      SELECT [S#] FROM SC 
      GROUP BY [S#] 
      HAVING COUNT (DISTINCT [C#])>5)
    题目2 
      问题描述: 
      已知关系模式: 
      S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名 
      C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师 
      SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩 
      
    1. 找出没有选修过“李明”老师讲授课程的所有学生姓名 
    --实现代码: 
      SELECT SNAME FROM S 
      WHERE NOT EXISTS ( 
      SELECT * FROM SC, C 
      WHERE SC.CNO=C.CNO 
      AND CNAME='李明' 
      AND SC.SNO=S.SNO) 
     
    2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩 
    --实现代码: 
      SELECT S.SNO, S.SNAME, AVG_SCGRADE=AVG (SC.SCGRADE) 
      FROM S, SC, ( 
      SELECT SNO 
      FROM SC 
      WHERE SCGRADE<60 
      GROUP BY SNO 
      HAVING COUNT(DISTINCT CNO)>=2 
      )A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO 
      GROUP BY S.SNO,S.SNAME 3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名 
    --实现代码: 
      SELECT S.SNO,S.SNAME 
      FROM S,( 
      SELECT SC.SNO 
      FROM SC,C 
      WHERE SC.CNO=C.CNO 
      AND C.CNAME IN('1','2') 
      GROUP BY SNO 
      HAVING COUNT (DISTINCT CNO) =2 
      )SC WHERE S.SNO=SC.SNO
     
    4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号 
    --实现代码: 
      SELECT S.SNO, S.SNAME 
      FROM S, ( 
      SELECT SC1.SNO 
      FROM SC SC1, C C1, SC SC2, C C2 
      WHERE SC1.CNO=C1.CNO AND C1.NAME='1' 
      AND SC2.CNO=C2.CNO AND C2.NAME='2' 
      AND SC1.SCGRADE>SC2.SCGRADE 
      )SC WHERE S.SNO=SC.SNO 5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩 
    --实现代码: 
      SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩] 
      FROM S,( 
      SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE 
      FROM SC SC1,C C1,SC SC2,C C2 
      WHERE SC1.CNO=C1.CNO AND C1.NAME='1' 
      AND SC2.CNO=C2.CNO AND C2.NAME='2' 
      AND SC1.SCGRADE>SC2.SCGRADE 
      )SC WHERE S.SNO=SC.SNO