Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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 关键字,必须跟随比较操作符,表示“对子查询返回的列中的任何值都满足比较操作符”。例如:

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

假设表 t1 中有一行记录为 (10)。如果表 t2 中包含 (21,14,7),因为 t2 中有值 7 小于 10,那么表达式为 TRUE。如果表 t2 中包含 (20,10),或表 t2 为空,那么表达式为 unknown(即 NULL)。如果表 t2 中包含 (NULL,NULL,NULL),那么表达式也为 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 在表达式列表中不等价。IN 可以使用表达式列表,但 = ANY 不可以。见第14.4.2节,“比较函数和操作符”

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

单词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可以确保每个人都理解查询的真正含义。

你可以在标量TABLE中使用INANYSOME子查询,假设表包含只有一个列。如果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);