s(s#,sname,age,sex)
c(c#,cname,teacher)
sc(s#,c#,grade)
如:选择选修了‘程军’所教的全部课程的学生可以如下:
 select sname from s,sc
   where s.s#=sc.s#
   and c# in (select c# from c
              where teacher='程军')
   group by sname,s.s#
   having count(*)=(select count(*) from c where teacher='程军')
  或
  select sname from s where not exists
  (select * from c where teacher='程军' and not exists
  (select * from sc where sc.s#=s.s# and sc.c#=c.c#))
  
可是选择选修了学号为2的同学所选修的全部课程的学生和着到题很类似,可是我却求部出来??
还有:选择选修课程与学号为2的同学所选修的课程都相同(不多不少)的学生
      选择选修课程与‘程军’所教的全部课程都相同(不多不少)可以如下
   最好能有exists 和not exists 来描述。

解决方案 »

  1.   

    --选修了学号为2的同学所选修的全部课程的学生
    select cname from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    where s#=2  --如果是姓名,就用 where sname='姓名'
      

  2.   

    --选择选修课程与学号为2的同学所选修的课程都相同(不多不少)的学生
    select sname from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    group by sname
    having count(cname)=(select count(*) from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    where s#=2  --如果是姓名,就用 where sname='姓名'
    )--选择选修课程与‘程军’所教的全部课程都相同
    select sname from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    group by sname
    having count(cname)=(select count(*) from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    where teacher='程军'
    )
      

  3.   

    马可兄:我有exists 或not exists 求不出上述两题,请指点
    zjcxc(邹建) 兄:能用exists 或not exists 来描述上述两题吗?(此法我也会)
      

  4.   

    select cname from sc a
    join s b on a.s#=b.s#
    join c c on a.c#=b.c#
    where s#=2  --如果是姓名,就用 where sname='姓名'此法有错,选出的是2号所选修的全部课程与题意不符
      

  5.   

    exists也可以,不过效率更低.只不过是嵌多一层查询而已.本质没有改变
      

  6.   

    不知各位大哥是否知道有没有除非用exists 关键字求不出来的SQL查询:否则的话设计此关键字是SQL设计者的失败之作。作为一个学习SQL的人来说,一个问题求出来并不代表着完成。本人认为有些问题是非EXISTS是不能解决的。现在对这个问题虽然没意义,不过我觉得能完全理解EXISTS是关键。我相信SQL设计者设计EXISTS关键字自有其道理的:就象算法中的递归,虽然大家都知道其效率是非常低的,可是就是因为其在解决非常复杂的问题时的简单性,现在还是有很多人在用他,而且有的问题还真是非递归可以解决的。还有一方面,设计一个非递归算法的复杂性远比一个递归的算法的复杂性来得高。有时候,牺牲一点效率是值得的。各位大哥还是给点意见吧!