回 帖 发 新 帖 刷新版面

主题:[讨论]EXISTS是怎么理解?还有any,some,all,in

SELECT * FROM ORDERS
WHERE EXISTS(SELECT *FORM ORDERS
WHERE NAME#='SB')
这样会返回orders里面所有的值,而不是只有NAME#='SB'的值

SELECT * FROM ORDERS
WHERE EXISTS
(SELECT * FROM CUSTOMER C WHERE STATE='NE' AND C.NAME#=O.NAME#)
这样确只有返回符合条件WHERE STATE='NE' AND C.NAME#=O.NAME#的值


USE JX
GO

SELECT     NAME#,ORDERDON 
FROM ORDERS 
WHERE  NAME#=ALL
(SELECT NAME# FROM ORDERS
WHERE NAME#='TRUE WHELL')
这样可以返回所有的行(orders中有两个值NAME#='TRUE WHELL')
而把all改为any或者some怎么就不会返回任何值呢?用in也是不会有任何值

回复列表 (共2个回复)

沙发

EXISTS 是用父表的行,来反复探测子查询,如果子查询在该行的数值下,结果集合非空,则 该行满足条件;  如果是NOT EXISTS, 则正好相反, 子查询的结果集合为空才表示符合条件. 具体过程可以参见:

http://www.programfan.com/club/post-240142.html

所以 EXISTS 总是用引用父亲或祖先表的子查询中,如:
select *
from   T1
where  exists (
       select * 
       from   T2 
       where T1.id = T2.id)

如果是常规的子查询,使用exists没有意义。

any 与 some 等价,用于和子查询构成布尔表达式, 如果子查询中有一个值能使布尔表达式为真,则该布尔表示式就为真。 上面的例子可以改写为等价的:

select *
from   T1
where  T1.id = any (
       select id
       from   T2 
       )

IN 与 = some/any等价, 上面的例子可改写为:

select *
from   T1
where  T1.id in (
       select id
       from   T2 
       )


all 和any,some类似,但必须是子查询的每一个值都要使表达式为真,该布尔表示式才为真;通常用于相关子查询中,这样的子查询会反复计算,每次得到不同的结果。如:
select *
from   T1
where T1.NAME = all 
   (select NAME
    FROM   T2
    WHERE  T2.id = T1.id)



板凳

楼上讲的很详细~

我来回复

您尚未登录,请登录后再回复。点此登录或注册