Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.2 数据操作语句  / 13.2.11 子查询  /  13.2.11.3 带有 ANY、IN 或 SOME 的子查询

13.2.11.3 带有 ANY、IN 或 SOME 的子查询

句法:

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

comparison_operator这些运算符之一 在哪里:

=  >  <  >=  <=  <>  !=

关键字必须跟在ANY比较运算符之后,意思是 如果比较是针对 子查询返回的列中的值,则返回。TRUETRUEANY例如:

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

假设表中有一行t1 包含(10)。表达式是 TRUEif table t2contains (21,14,7)因为其中有一个 值小于 7。表达式是 if table contains ,或者 if table为空。如果表包含 ,则表达式未知(即 ) 。 t210FALSEt2(20,10)t2NULLt2(NULL,NULL,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表达式列表一起使用时不是同义词。 IN可以采用表达式列表,但 = ANY不能。请参阅 第 12.4.2 节,“比较函数和运算符”

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

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

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

这个词SOME很少用到,但这个例子说明了为什么它可能有用。对于大多数人来说,英语短语a is not equal to any b的意思是 不存在等于 a 的 b ” ,但这不是 SQL 语法的意思。语法意思是 有一些 b 不等于 a。使用 <> SOMEinstead 有助于确保每个人都理解查询的真正含义。

从 MySQL 8.0.19 开始,您可以 TABLE在标量 INANYSOME子查询中使用,前提是表仅包含一个列。如果t2只有一列,则本节前面显示的语句可以按此处所示编写,在每种情况下都替换TABLE t2SELECT s1 FROM t2

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

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

SELECT s1 FROM t1 WHERE s1 IN (TABLE t2);

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

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