日期:2014-05-18  浏览次数:20469 次

关于EXISTS的问题
我想请大家帮我解析一下以下查询语句:
3张基本表:
S(S#,SNAME,AGE,SEX)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
1、查询学习全部课程的学生姓名,语句如下:
SELETE   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#))
NOT   EXISTS的语义是什么,我应该理解为“不存在”|“不满足”?
3个SELECT语句的含义是什么,请解释一下,其中的*代表什么,表示所有属性列?特别是第2个,C和S没有关联,我不知道怎么翻译。

2、查询所学课程包含学生S3所学课程的学生学号
SELECT   DISTINCT   S#
FROM   SC   AS   X
WHERE   NOT   EXISTS
                    (SELECT   *
                      FROM   SC   AS   Y
                      WHERE   Y.S#   =   'S3 '
                      AND   NOT   EXISTS
                                      (SELECT   *
                                        FROM   SC   AS   Z
                                        WHERE   Z.S#   =   X.S#
                                        AND   Z.C#   =   Y.C#))
SC   AS   X|Y|Z是否代表SC的三个别名,他们是代表一张SC还是三张SC,是不是产生了连接操作,什么时候需要使用AS。
3个SELECT语句的含义是什么,请解释一下。

3、查询不学C2课程的学生姓名与年龄
SELECT   SNAME,AGE
FROM   S
WHERE   S#   NOT   IN
                  (SELECT   S#
                    FROM   SC
                    WHERE   C#= 'C2 '))

SELECT   SNAME,AGE
FROM   S
WHERE   NOT   EXISTS
            (SELECT   *
              FROM   SC
              WHERE   SC.S#   =   S.S#
              AND   C#= 'C2 '))
以上有两种方法,我想问问为什么使用NOT   EXISTS时前面没有属性名,是表示所有属性吗?还有为什么使用NOT   EXISTS时子SELECT语句的条件多了一个SC.S#=S.S#


请大家多多指教,谢谢


------解决方案--------------------
EXISTS同NOT EXISTS
更好的理解是
交集与差集

解析第一句SQL
SELETE SNAME
FROM S
WHERE NOT EXISTS