CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

带存在量词NOT EXISTS的SQL语句问题求教

楼主sxrj()2003-10-01 14:10:39 在 MS-SQL Server / 基础类 提问

学生表Student       (Sno学号     Sname姓名       Sdept所在系)  
  课程表Course           (Cno课程号       Cname课程名       Cpno选修课号         Ccredit学分)  
  学生选课表SC           (Sn0学号     Cno课程号       Grade成绩)  
  对以上表进行查寻选修了全部课程的学生姓名  
  由于不,没有全称量词,可将题目的意思转换为等价的存在量词形式:查询这样的学生,没有一门课程是他不选修的  
   
  SELECT   Sname  
  FROM   Student  
  WHERE   NOT   EXISTS  
  (SELECT   *  
    FROM   Course  
    WHERE   NOT   EXISTS  
              (SELECT   *  
                FROM   SC  
                WHERE   Sno=Student.Sno   AND   Cno=Course.Cno))       此行的内部运行方式是怎样的?是先找出一个学生的学号,在课程表中一门课一门课地找,找到一门课以后就向下找,直到找到一门他没有学习的课或课程表的最后一门课才将相应的结果返回真或假吗?  
  又一问题,单说内层查询,是找他学了全部课程以后该查询应当为真还是假?经过NOT   EXISTS以后又向上级查询返回真还是假?  
  为什么有这样的问题呢?因为我的判断(当然是错误的了)是当找到了学习全部课程的学生以后,返回了假,这似乎是在找没有选修全部课程的学生,最终应当将结果取反才能得到选修了全部课程的学生的学号。  
  我的逻辑关系已经乱了,所以希望指点我的高人说细一点,解释地透彻一点,谢谢了  
  问题点数:10、回复次数:10Top

1 楼shuangyu(虎口脱险)回复于 2003-10-01 14:55:34 得分 0

学生表Student       (Sno学号     Sname姓名       Sdept所在系)  
  课程表Course           (Cno课程号       Cname课程名       Cpno选修课号         Ccredit学分)  
  学生选课表SC           (Sn0学号     Cno课程号       Grade成绩)  
   
  select   *   from   student   a     join   (select     Sno   count(Cno)   as   Thecount   from   Sc   group   by   Sno   )   b   on   a.Sno=b.Sno   where   b.TheCount=(select   count(*)   from   Course)  
  先根据学号分组,得到所有学生的选修总数,然后根据总数等于course中的总数,就找到了  
  Top

2 楼w_rose(w_rose)回复于 2003-10-01 16:20:10 得分 10

“全称量词”很自然地需要转换为not   exists来处理。逻辑表达中,不需要“全称量词”,只表达“何物存在”就可以了(这是40、50年前西方分析哲学的基本结论)。any   XXX等价于exist   XXX的“矛盾句子被否定”。逻辑中,如果去掉显式的“全称量词”,可以避免很多空洞、含糊的描述形式(当然增加精确性的同时也增加了一点表达的难度)。  
   
  “学生x选修了全部课程”,转换为以下这个查询被否定。这个查询就是:存在课程y,x没有选修y。(参看下边的伪代码)  
   
  了解了逻辑涵义,关于所谓“内部运行方式”就比较好说了。这是“相关子查询”,即内层的查询关联外层查询的结果,所以查询规划首先是对外层进行查询,然后再处理内层的匹配记录。相当于以下伪代码:  
   
  for   each   x   in   student  
      if   判断学生(x)   then   print   x  
  next  
   
  function   判断学生(x)  
      for   each   y   in   course  
          if   exists   select   (*   from   sc   where   学生=x   and   课程=y)   return   false  
      next  
      return   true  
  end   function  
   
  最初IBM开发的SQL只有exists和not   exists相关子查询并且认为足够了(如果在理论上追根述源也确实是足够了),以后为了用户方便才增加了in、all、any等等,用户可以使用扩展的形式简化语句。Top

3 楼w_rose(w_rose)回复于 2003-10-01 16:22:46 得分 0

if   exists   select   (*   from   sc   where   学生=x   and   课程=y)   return   false  
  ----------------------------------------------------------------------  
  exists应当为not   exists。Top

4 楼snglfng()回复于 2003-10-01 17:39:35 得分 0

厉害!!!  
  Top

5 楼yangvxin1(小杨)回复于 2003-10-03 01:03:46 得分 0

fabulousTop

6 楼sxrj()回复于 2003-10-06 15:00:29 得分 0

upTop

7 楼sxrj()回复于 2003-10-07 19:44:27 得分 0

还有更通俗的吗?Top

8 楼sxrj()回复于 2003-10-09 00:54:53 得分 0

upTop

9 楼pumag(大米)回复于 2003-10-09 10:54:23 得分 0

让我想起了痛苦的《数字逻辑》课程Top

10 楼liqinger184(沧桑)回复于 2003-10-26 10:48:24 得分 0

up!!!!!!!!还有更通俗的不咯?Top

相关问题

  • 怎样将oracle sql中的in语句改为exists语句?
  • 求SQL语句
  • sql语句。
  • sql语句?
  • sql 语句?
  • 求SQL语句
  • ***求SQL语句***
  • sql语句??
  • sql语句
  • sql语句

关键词

  • 课程
  • 学号
  • 学生
  • 查询
  • 逻辑
  • 转换
  • 选修
  • sno
  • cno
  • exists

得分解答快速导航

  • 帖主:sxrj
  • w_rose

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo