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 ALL

15.2.15.4 ALL 子查询

语法:

operand comparison_operator ALL (subquery)

关键字 ALL,它必须跟在比较操作符后面,表示如果子查询返回的列中的所有值都满足比较操作符,那么就返回 TRUE。例如:

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

假设表 t1 中有一行记录为 (10)。如果表 t2 中包含值 (-5,0,+5),那么表达式将返回 TRUE,因为 10 大于 t2 中的所有值。如果表 t2 中包含值 (12,6,NULL,-100),那么表达式将返回 FALSE,因为表 t2 中存在一个值 12 大于 10。如果表 t2 中包含值 (0,NULL,1),那么表达式将返回unknown(即 NULL)。

最后,如果表 t2 是空表,那么表达式将返回 TRUE。因此,以下表达式在表 t2 是空表时返回 TRUE

SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);

然而,这个表达式在表 t2 是空表时返回 NULL

SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);

此外,这个表达式在表 t2 是空表时也返回 NULL

SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);

一般来说,包含 NULL 值的表空表edge cases. 在编写子查询时,始终考虑是否已经考虑了这两个可能性。

NOT IN 等同于 <> ALL。因此,这两个语句是相同的:

SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);

INANYSOME 类似,您可以使用 TABLEALLNOT IN,只要满足以下两个条件:

  • 子查询中的表只包含一个列

  • 子查询不依赖于表达式

例如,假设表 t2 只包含一个列,那么前两个语句可以使用 TABLE t2 来写作:

SELECT s1 FROM t1 WHERE s1 <> ALL (TABLE t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (TABLE t2);

类似于 SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2); 这样的查询不能使用 TABLE t2,因为子查询依赖于表达式。