有3个表S,C,SC
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
3,即学过1号课程有学过2号课所有学生的姓名。
请用标准SQL语言写出答案,方言也行(请说明是使用什么方言)。

解决方案 »

  1.   

    1.
    select SNAME from S where S.SNO <>(select SNO from SC where SC.CNO in (select CNO from C where CTEACHER="黎明"))
      

  2.   

    2.
    select s.sno,s.sname,avg(sc.scgrade) from s,sc where s.sno=sc.sno
     and s.sno in (select sno from (select sno,count(sno) scount from sc where group by sno having scgrade<60) where scount>=2)
    试试吧,没实验过~~~~
      

  3.   


     select s.sname from s right outer join sc on s.sno=sc.sno 
      where sc.cno=1 or sc.cno=2
      group by sname
      having count(sname)=2
      

  4.   

    3 重写一下
     select s.sname from s right outer join sc on s.sno=sc.sno 
      where sc.cno=1 or sc.cno=2
      group by s.sname
      having count(s.sname)=2
      

  5.   

    2.
    select s.sname,ss.avgrade from s,(select sno,avg(scgrade) avgrade from sc where sno in (select sno from (select sno,count(sno) scount from sc where  scgrade<60 group by sno) where scount>=2) group by sno) ss where s.sno=ss.sno
    第二题这个行,我实验过了,就是太长了,没简化~~~
      

  6.   

    分析:这是一道精点的学生和老师的多对多关系,将用三张表表示成
    学生 和 选课 为 多对 一的关系
    选课 和 老师  分解为 一对多的关系;
     
    1.找出没选过“黎明”老师的所有学生姓名。
    SELECT sname
      FROM s JOIN sc ON s.sno = sc.sno
           JOIN c ON c.cno = sc.cno
     WHERE c.cname = '黎明'2.列出2门以上(含2门)不及格学生姓名及平均成绩
    SELECT   sname
        FROM s
             JOIN
             (SELECT SNO
                FROM sc
               WHERE sc.scgrade < 60) sct ON s.SNO = sct.SNO
    GROUP BY sname
      HAVING COUNT (sname) > 2
    3.即学过1号课程有学过2号课所有学生的姓名。
    SELECT DISTINCT sname
               FROM s s
                    JOIN
                    (SELECT sname
                       FROM sc) sct ON s.sno = sct.sno
                    JOIN
                    (SELECT cno
                       FROM c c
                      WHERE cno = '1' OR cno = '2') ct ON sct.cno = ct.cno 
      

  7.   

    hnzpabc(小菜) 
    2.列出2门以上(含2门)不及格学生姓名及平均成绩
    SELECT   sname
        FROM s
             JOIN
             (SELECT SNO
                FROM sc
               WHERE sc.scgrade < 60) sct ON s.SNO = sct.SNO
    GROUP BY sname
      HAVING COUNT (sname) > 2
    这个没写平均值,呵呵
    3.即学过1号课程有学过2号课所有学生的姓名。
    SELECT DISTINCT sname
               FROM s s
                    JOIN
                    (SELECT sname
                       FROM sc) sct ON s.sno = sct.sno
                    JOIN
                    (SELECT cno
                       FROM c c
                      WHERE cno = '1' OR cno = '2') ct ON sct.cno = ct.cno
    这里的sct.cno好象没有被说明过
      

  8.   


    select s.sname from s,sc,c where s.sno=sc.sno and c.cno=sc.cno and cteacher not exits("黎明")
      

  9.   

    sct 是SELECT SNO FROM sc WHERE sc.scgrade < 60 的一个别名
      

  10.   

    hnzpabc(小菜) 
    3.即学过1号课程有学过2号课所有学生的姓名。
    SELECT DISTINCT sname
               FROM s s
                    JOIN
                    (SELECT sname
                       FROM sc) sct ON s.sno = sct.sno
                    JOIN
                    (SELECT cno
                       FROM c c
                      WHERE cno = '1' OR cno = '2') ct ON sct.cno = ct.cno
    这里的sct.cno好象没有被说明过在SELECT sname FROM sct 并没有cno列
      

  11.   

    改正一下
    SELECT DISTINCT sname
               FROM s s
                    JOIN
                    (SELECT cno,sno
                       FROM sc) sct ON s.sno = sct.sno
                    JOIN
                    (SELECT cno
                       FROM c c
                      WHERE cno = '1' OR cno = '2') ct ON sct.cno = ct.cno
      

  12.   

    2 select sname,avg(scgrade) from s,sc where s.sno=sc.sno and s.sno in (select sno from sc where scgrade <60 group by s.sno having count(*)<=60) group by sname ;在机子上试过,正确
      

  13.   

    select s.sname from s,sc,c where s.sno=sc.sno and c.cno=sc.cno and cteacher not in('黎明')
    在MYSQL上通过
      

  14.   

    3 select sname from s where sno in (select a.sno from (select sno,scgrade from sc where cno=11) as a,(select sno,scgrade from sc where cno=12) as b where a.sno=b.sno );
      

  15.   

    题目中的‘SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)’
    是否应该该为:SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!