解决方案 »

  1.   

    是未选修C4课程的学生吧!
    NOT EXISTS 是一个  是真是假   的逻辑判断,对它后边括号中如果有符合的记录能查询到,那么就是  真,这整个条件就满足,如果没有记录,那就是  假,这个条件不满足。
      

  2.   

    NOT EXISTS是不符合条件的才返回,另外你只给了一个表的数据,看不到S表的内容
      

  3.   


    s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
      

  4.   

    你看看是不是等价这个:SELECT  *
    FROM    s
    WHERE   s# NOT IN ( SELECT  s#
                        FROM    sc
                        WHERE   c# = 'C4' )
      

  5.   


    s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
    你括号里的条件也就是选C4吧,NOT EXISTS返回没选C4的呗…… 最好把S表也放出来,可以帮你实际测一下= =
      

  6.   


    这个我知道啊, 我不是不明白 NOT EXISTS 的含义,而是他执行的原理
      

  7.   


    s表没关系吧,就是s1到s6六名学生的信息我说的s1选c1这个不就是 不符合条件吗 怎么没返回呢?
    你括号里的条件也就是选C4吧,NOT EXISTS返回没选C4的呗…… 最好把S表也放出来,可以帮你实际测一下= =现在我没在用电脑呀,s表没什么问题啊,就是s1到s6几个学生信息 ,学号 姓名 年龄 性别  没有空值
      

  8.   

    not exists里面是and c# = 'C4',而sc表中满足这个条件的是S1/S3/S4,又应为not exists有一个=谓词,所以S1/S3/S4这三个值在S表中的话就不返回,所以范围S2/S5/S6
      

  9.   

    如果换成EXISTS,那么会返回S1/S3/S4
      

  10.   

    exists/not exists里面的 S.S#=SC.S# 在你这个例子中等于join,而后面的and 等于筛选条件
      

  11.   


    老大 你这下说到点子上啦 
    我想我是钻牛角尖了
    其实 NOT EXISTS 就是  返回 EXISTS 没返回的值
    或者说 他不是一个操作而是 NOT  ( EXISTS 条件 ) 是对 EXISTS 的返回值求补集  这么理解 对吧
      

  12.   

    本帖最后由 DBA_Huangzj 于 2014-07-01 13:55:32 编辑
      

  13.   

    哈哈哈哈 我明白了 谢谢大家 
    就是被误导了 NOT EXISTS 理解为  “不存在”  就坑爹了
    应该是 求 EXISTS返回值的补集 执行过程不是 判断不满足的条件就 返回
    而是 先返回满足的条件 再求其补集
      

  14.   

    还要看条件。你这个例子可以,不代表全部例子都可以,有些内层where条件可能导致问题,我以前就试过,不过一时半刻找不出来
      

  15.   

    CREATE TABLE t1(id int)
    CREATE TABLE t2(id INT )INSERT INTO t1 
    VALUES(1),(2),(3)
    INSERT INTO t2
    VALUES(1),(2)
    SELECT * FROM t1 a
    WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)
    SELECT * FROM t1 a
    WHERE NOT  EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id)/*
    id
    -----------
    1
    2(2 row(s) affected)id
    -----------*/
    不懂,反正我这样理解都解释的通了,结贴啦啦啦
      

  16.   


    不懂,反正我这样理解都解释的通了,结贴啦啦啦没问题啊大人,你这个刚好说明了互为补集
    SELECT * FROM t1 a
    WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)
    SELECT * FROM t1 a
    WHERE NOT EXISTS(SELECT 1 FROM t2 b WHERE a.id=b.id)SELECT * FROM t1 a
    WHERE EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id)
    SELECT * FROM t1 a
    WHERE NOT EXISTS(SELECT 1 FROM t2 b WHERE a.id<>b.id) 
    四个查询结果id
    -----------
    1
    2(2 行受影响)id
    -----------
    3(1 行受影响)id
    -----------
    1
    2
    3(3 行受影响)id
    -----------(0 行受影响)
      

  17.   

    我的意思是负负得正,NOT EXISTS的话,如果要得到和EXISTS的相同结果,理论上在内层也要把=变成<>,不过结果却不是,可能我和你想的东西有点方向不同而已。
      

  18.   

    哪些人是员工(not exists)
    select ename from emp_hiloo o 
    where not exists
                   (select 1 from emp_hiloo i
                    where o.empno = i.mgr)
    哪些部门没有员工?(否定问题)
    select dname from dept_hiloo o
    where not exists 
                     (select 1 from emp_hiloo i
                      where o.deptno = i.deptno)
    对于not exsits来说,子查询的返回结果必须是no rows selected,才符合not exsits的条件(主表里的记录放入结果集).
    如果子查询在执行过程中找到了一条符合条件的记录,子查询立即返回,not exists已经不可能成立了.(主表里的记录被过滤掉)
    原来资料里找的希望对你有帮助