文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  使用 ANY、IN 或 SOME 的子查询

15.2.15.3 使用 ANY、IN 或 SOME 的子查询

语法

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

其中 comparison_operator 是以下运算符之一

=  >  <  >=  <=  <>  !=

ANY 关键字必须位于比较运算符之后,表示 如果子查询返回的列中的 ANY 值都满足比较条件,则返回 TRUE 例如

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

假设表 t1 中有一行包含 (10)。如果表 t2 包含 (21,14,7),则该表达式为 TRUE,因为 t2 中存在一个值 7 小于 10。如果表 t2 包含 (20,10),或者表 t2 为空,则该表达式为 FALSE。如果表 t2 包含 (NULL,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 不行。请参阅 第 14.4.2 节,“比较函数和运算符”.

NOT IN 不是 <> ANY 的别名,而是 <> ALL 的别名。参见 第 15.2.15.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 的意思是 没有一个 b 等于 a,但这并不是 SQL 语法所指的意思。语法的意思是 存在一个 b 不等于 a。 使用 <> SOME 代替有助于确保每个人都理解查询的真正含义。

你可以在标量 INANYSOME 子查询中使用 TABLE,前提是该表只包含一列。如果 t2 只有一个列,那么本节前面显示的语句可以按如下方式编写,在每种情况下用 TABLE t2 代替 SELECT 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);