zoukankan      html  css  js  c++  java
  • 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))


     

  • 相关阅读:
    Enterprise Library 4.1 Data Access Block 快速使用图文笔记
    敏捷开发(名字起得很帅,很忽悠人)原则 括号里面加了自己的理解笔记
    与弟弟谈话的摘要
    练习:选头像控件
    [转]保护你的flash(as3)程序基于socket方式传送swf文件
    Silverlight 又多了一套skin
    Silverlight制作逐帧动画
    Silverlight Spy 2 源代码查看器
    跨平台开发silverlight
    Silverlight 2 搜索照片 Live
  • 原文地址:https://www.cnblogs.com/barney/p/1247883.html
Copyright © 2011-2022 走看看