哪位达人能介绍一下exists和not exists用法(sql)最好能举个例子我看网上说not exists select * from table where a=1 or b=2;只要a=1成立,就不会查询b=2了那如果or 换成 and呢?还有人说not exists是个双重否定.请牛人指教.

解决方案 »

  1.   

    我的理解:
    exists 存在 和not   exists  不存在
     先把sql写成in ,not in ,然后加个where条件就变成 exists和not   exists
    你说的那个在高级语言中都有的,教什么忘了,优化的结果
      

  2.   

    exists (sql 返回结果集为真)
    not exists (sql 不返回结果集为真)
      

  3.   

    楼主的意思应该是exit与in的区别
      

  4.   

    我个人认为查看一下《lecture 7 集合代数.ppt》中的最后一个片子,可能有些帮助。下载地址为:http://www.aybook.cn/soft/7/78/2007/book_2868.html。
      

  5.   

    我看网上说not   exists   select   *   from   table   where   a=1   or   b=2; 只要a=1成立,就不会查询b=2了 ------
    你的例子就可以
    not exists 判断后面的select语句不返回结果集
    你例子中,因为是Or,如果a=1返回,那么已经不满足,or后面当然也没有必要执行了
    如果and,当然要前后都判断,才能知道是否能够返回结果集
      

  6.   

    exists   (sql   返回结果集为真) 
    not   exists   (sql   不返回结果集为真)
    如下:
    表A
    ID NAME 
    1   A1
    2   A2
    3   A3表B
    ID AID NAME
    1   1   B1
    2   2   B2 
    3   2   B3表A和表B是1对多的关系 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
    执行结果为
    1   A1
    2   A2
    原因可以按照如下分析
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
    --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
    --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
    --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据NOT EXISTS 就是反过来
    SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
    执行结果为
    3   A3
    ===========================================================================
    EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
    SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
    SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
      

  7.   

    发现一个电子书下载的网站
    很多方面的书
    大家可以去看看
    http://www.51cnnet.net
      

  8.   

    exists : 强调的是是否返回结果集,不要求知道返回什么,   比如:
               select name from student where sex = 'm' and  exists(select 1 from grade where ...) ,只要
    exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
              select name from student where sex = 'm' and  in (select 1,2,3 from grade where ...
    ,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。而not exists 和not in 分别是exists 和 in 的 对立面,就不用在说了吧?!
    不知道你看懂了没有 ?希望对你有用。