如下题:
设关系模式:Student(Sid,Sname)其中id为主键,SC(Sid,Cid,grade)其中主键(Sid,Cid),外键(Sid,Cid);
Sid为学生学号,Sname为学生姓名,Cid为课程编号,grade为课程分数1.查询只选修了2号课程的学生学号
2.查询除了2号课程还选了其他课程的学生学号
3.查询选修了课程但没有选2号课程的学生学号
4.查询没有选修2号课程的学生的姓名。小弟接触mysql时间不长,只会Select的简单查询,恳求高手解答。

解决方案 »

  1.   


    ----先声明,我是菜鸟,而且许久没有写过SQL了
    1.查询只选修了2号课程的学生学号select a.sid from SC a left join SC b on a.sid=b.sid
     where a.cid='2号课程' group by a.sid having count(a.sid)=1;
    ----方法有多个,这个算是一个吧。2.查询除了2号课程还选了其他课程的学生学号
    select a.sid from SC a left join SC b on a.sid=b.sid
     where a.cid='2号课程' group by a.sid having count(a.sid)>1;
    3.查询选修了课程但没有选2号课程的学生学号
    select sid from SC 
         minus 
    select sid from SC  where cid='002'4.查询没有选修2号课程的学生的姓名。----这个可能会有学生是什么课程也没有选的,所以使用左链接。
    select sname from Student s left join sc on s.sid=sc.sid 
     where  sc.sid in 
      (select sid from SC 
         minus 
       select sid from SC  where cid='002');
    -----使用in的性能不好,-_-||
    ----没有验证,不知可否。
      

  2.   


    嗯,很不错,我自己也写了一下:
    1.select sid from sc where cid='2' and exist
      (select sid,count(sid) from sc group by sid having count(sid)=1);
    2.语句和1一样,只是将条件改为count(sid)>1
    3.select sid from sc where not exist
      (select sid from sc where cid='2');
    第4个我还是很纠结,左链接查询不是很理解,还有那个minus集合查询操作,我还没有接触到,不知道except操作是不是有同样的效果,不过受你的启发,我写成这样不知道可以不
       select sname from student left join sc on student.sid=sc.sid where exist
       (select sc.sid from sc where not exist
        (select sc.sid from sc where sc.cid='2'));
    我自己感觉很冗杂。
    ps:很感谢你的答复,呵呵。
         我是从mysql入手的,请问你用的是什么DBMS呢?
      

  3.   

    1. 查询只选修了2号课程的学生学号
    Select Sid from SC t where Cid=2 and not exists (select 1 from SC where Sid=t. Sid and Cid!=2)2. 查询除了2号课程还选了其他课程的学生学号
    Select Sid from SC t where Cid=2 and exists (select 1 from SC where Sid=t. Sid and Cid!=2)3. 查询选修了课程但没有选2号课程的学生学号
    Select Sid from SC t where not exists (select 1 from SC where Sid=t. Sid and Cid=2)
    4. 查询没有选修2号课程的学生的姓名。
    Select * from Student where Sid not in (select Sid from SC where Cid=2)