13.2.10.3 带有 ANY,IN 或 SOME 的子查询

Syntax:

operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)

其中* comparison_operator *是以下运算符之一:

=  >  <  >=  <=  <>  !=

关键字ANY(必须紧跟比较运算符之后)table 示“如果子查询返回的列中的值ANY的比较是TRUE,则返回TRUE”。例如:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

假设 tablet1中有一行包含(10)。如果 tablet2包含(21,14,7),则 table 达式为TRUE,因为t2中的值7小于10。如果 tablet2包含(20,10)或 tablet2为空,则 table 达式为FALSE。如果 tablet2包含(NULL,NULL,NULL),则 table 达式为* unknown *(即NULL)。

与子查询一起使用时,单词IN= ANY的别名。因此,这两个语句是相同的:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

IN= ANY与 table 达式列 table 一起使用时不是同义词。 IN可以接受 table 达式列 table,但= ANY不能。参见第 12.3.2 节“比较函数和运算符”

NOT IN不是<> ANY的别名,而是<> ALL的别名。参见第 13.2.10.4 节“带有 ALL 的子查询”

SOMEANY的别名。因此,这两个语句是相同的:

SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

很少使用单词SOME,但是此示例说明了为什么可能有用。对于大多数人来说,英语短语“ a 不等于任何 b”的意思是“不存在等于 a 的 b”,但这不是 SQL 语法的含义。语法的含义是“存在一些 b 不等于 a”。使用<> SOME可以帮助确保每个人都了解查询的真实含义。