sql exsits问题!!

复习数据库,看到EXISTS这个谓语的时候,我真的有点晕菜了,平时没有注意,现在我怎么看都看不懂它的流程

数据库题目里面有很多题目是关于“所有”问题的,比如:查询选修所有课程的学生的名字。这时候理论上就轮到exists和no exists出手了,由于我看球不懂这个谓语的执行顺序,自己用其他方法写了个,希望老师不会打我错啊!

下面是一个例题(从网上抄的一个题目):
有学生选课关系
S(Snum,Sname,Ssex,Sage,Dnum)

Snum Sname Sex Age SD
S001 王明 男 19 D2
S002 李勇 男 23 D3
S003 刘燕 女 21 D1
S004 王萍 女 23 D1
S005 王佳 男 24 D3
S006 赵婷 女 20 D1

SC(Snum,Cnum,Score)
Snum Cnum Score
S001 C1 83
S001 C2 89
S001 C3 65
S001 C4 85
S001 C5 85
S002 C3 69
S002 C4 75
S003 C1 95
S004 C1 85
S005 C2 92
S005 C3 76

C(Cnum,Cname,Cfreq)
Cnum Cname Cfreq
C1 数据库系统原理 4
C2 C程序设计 4
C3 计算机体系结构 3
C4 自动控制原理 2
C5 数据结构 4

求选修了所有课程的学生的名字?
标准答案:
select Sname
From  S
Where  not exists
(select *
From  C
Where  not exists
(select *
From  SC
Where  Snum=S.Snum
and Cnum=C.Cnum))

我实在是看不懂Where  Snum=S.Snum and Cnum=C.Cnum放在这里是什么意思,太笨了没得办法,那位兄台知道这个语句的执行顺序的话还望不吝指教。

我自己写的:语意是选择选修了所有5门课的学生的姓名。
select Sname
From S
Where Snum in(
select Snum
From SC
group by Snum
having count(Cnum)=5
)

---------------------------------------------------

s表存储学生的信息  
  c表存储课程信息  
  sc表存储学生成绩  
   
  查询返回的结果是所有课程都有成绩的学生的名字  
   
  select   sname  
  from   s    
  where   not   exists  
      (select     *    
        from   c  
        where   not   exists  
      (select   *   from   sc   where   sc.s#   =   s.s#  
        and   sc.c#=c.c#))  
   
  1、先看第一个exists后面的那部分:  
  (select     *    
        from   c  
        where   not   exists  
      (select   *   from   sc   where   sc.s#   =   s.s#  
        and   sc.c#=c.c#))  
   
      先看select   *   from   sc   where   sc.s#   =   s.s#   and   sc.c#=c.c#),接联查询,从sc中查询出所有“选了某门课程并且该门课程有成绩的学号、课程号以及该课程分数”,那么  
  where   not   exists  
      (select     *    
        from   c  
        where   not   exists  
      (select   *   from   sc   where   sc.s#   =   s.s#  
        and   sc.c#=c.c#))  
  的意思就是从c表中“查询出某些课程号,满足这些课程号是某些学生没有选的”  
  2、再看整个查询语句的意思就是“查询出学生的名字,满足没有一门课程是他没有选的”  
   
  所以整个查询结果就是:所有课程都选了的学生的名字   

 

负负得正,记住这个就行了理解了好久。

帮顶!   
  ---------------

 

42 查询选修了全部课程的学生姓名。

SELECT Sname

FROM Student

WHERE NOT EXISTS

    (SELECT *

    FROM Course

    WHERE NOT EXISTS

          (SELECT *

   FROM SC

   WHERE SC.SnoStudent.Sno

          AND SC.CnoCourse.Cno))

43 查询至少选修了学生95002选修的全部课程的学生号码。

本题的查询要求可以做如下解释,查询这样的学生,凡是95002选修的课,他都选修了。换句话说,若有一个学号为x的学生,对所有的课程y,只要学号为95002的学生选修了课程y,则x也选修了y;那么就将他的学号选出来。

即不存在这样的课程y,学生95002选修了y,而学生x没有选。用SQL语言可表示如下:

SELECT DISTINCT Sno

FROM SC SCX

WHERE NOT EXISTS

    (SELECT *

    FROM SC SCY

WHERE SCY.Sno’95002’ AND

    NOT EXISTS

    (SELECT *

    FROM SC SCZ

    WHERE SCZ.SnoSCX.Sno AND

    SCZ.CnoSCY.Cno))


 

posted @ 2008-07-21 18:07  barney  阅读(1406)  评论(0编辑  收藏  举报