文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  使用 ALL 的子查询

15.2.15.4 使用 ALL 的子查询

语法

operand comparison_operator ALL (subquery)

关键字 ALL 必须紧随比较运算符,其含义是 如果比较对子查询返回的列中的所有值都为 TRUE,则返回 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),则表达式为 未知 (即 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值的表空表 被视为边缘情况。 在编写子查询时,始终要考虑是否已经将这两种可能性考虑在内。

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 编写,因为子查询依赖于列表达式。