Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Subqueries with ANY, IN, or SOME

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

语法:

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

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

=  >  <  >=  <=  <>  !=

关键字 ANY,必须跟在比较运算符后面,表示“如果比较结果为 TRUE,则返回 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 而不是 <> ANY 可以确保每个人都理解查询的真实含义。

如果表 t2 只有一列,可以在标量 INANYSOME 子查询中使用 TABLE,例如:

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);