TheKitMurkit Asked: 2016-07-11 03:29:17 +0800 CST2016-07-11 03:29:17 +0800 CST 2016-07-11 03:29:17 +0800 CST “<> ANY(…)”和“NOT = ANY(…)”之间的区别? 772 你能解释一下这两个运营商之间的区别吗? sID != smth 而不是 sID = smth。 乍一看,他们似乎完全平等。但他们给出了不同的结果。 sql-standard operator 2 个回答 Voted Best Answer ypercubeᵀᴹ 2016-07-11T04:11:57+08:002016-07-11T04:11:57+08:00 NOT sid = ANY (SELECT ...) 相当于: sid <> ALL (SELECT ...) 所以,你的两个条件不一样。 ALL并且ANY操作员对我(和很多人)来说很难使用。我认为这就是有多少人更喜欢使用IN, NOT IN,这EXISTS会NOT EXISTS产生更多不言自明的代码。 如果您确实想与他们合作,请认为这sid = ANY (SELECT ...)意味着“检查是否sid等于任何(某些)(select...)值”。 然后NOT sid = ANY (SELECT ...)是相反的。但是“等于其中任何一个”的反义词是“对所有这些都不同”(而不是“与其中一些不同”)。 Martin Smith 2016-07-11T03:57:46+08:002016-07-11T03:57:46+08:00 这就是 SQL 标准所说的ANY <量化比较谓词> ::= <行值构造函数> <comp op> <quantifier> <table subquery> <量词> ::= <全部> | <一些> <全部> ::= 全部 <一些> ::= 一些 | 任何 通用规则 1) 令 R 为 <row value constructor> 的结果,令 T 为 <table subquery> 的结果。 2) "R <comp op> <quantifier> T" 的结果是通过对 T 中的每一行 RT 应用隐含的 <comparison predicate> "R <comp op> RT" 得出的: 案子: a) 如果 T 为空或隐含的 <comparison predicate> 对于 T 中的每一行 RT 为真,则“R <comp op> <all> T”为真。 b) 如果隐含的 <comparison predicate> 对于 T 中的至少一行 RT 为假,则“R <comp op> <all> T”为假。 c)如果隐含的 <comparison predicate> 对于 T 中的至少一行 RT 为真,则“R <comp op> <some> T”为真。 d)如果 T 为空,或者对于 T 中的每一行 RT,隐含的 <comparison predicate> 为假,则“R <comp op> <some> T”为假。 e) 如果“R <comp op> <quantifier> T”既不是真也不是假,那么它是未知的。 考虑 sID = 1 并且子查询返回 1,2,3 的情况。 比较的结果是 +---+-------+-------+ | | = | <> | +---+-------+-------+ | 1 | TRUE | FALSE | | 2 | FALSE | TRUE | | 3 | FALSE | TRUE | +---+-------+-------+ 所以= ANY返回 true 因为它检查至少有一行=1。 TRUE OR FALSE OR FALSE = TRUE 反过来<> ANY也返回 true ,因为它检查至少有一行<> 1。 FALSE OR TRUE OR TRUE = TRUE 然后你否定 <> ANY它,它就变成了false。
相当于:
所以,你的两个条件不一样。
ALL
并且ANY
操作员对我(和很多人)来说很难使用。我认为这就是有多少人更喜欢使用IN
,NOT IN
,这EXISTS
会NOT EXISTS
产生更多不言自明的代码。如果您确实想与他们合作,请认为这
sid = ANY (SELECT ...)
意味着“检查是否sid
等于任何(某些)(select...)
值”。然后
NOT sid = ANY (SELECT ...)
是相反的。但是“等于其中任何一个”的反义词是“对所有这些都不同”(而不是“与其中一些不同”)。这就是 SQL 标准所说的
ANY
考虑 sID = 1 并且子查询返回 1,2,3 的情况。
比较的结果是
所以
= ANY
返回 true 因为它检查至少有一行=1
。反过来
<> ANY
也返回 true ,因为它检查至少有一行<> 1
。然后你否定
<> ANY
它,它就变成了false
。