MySQL 9.0 发行说明
语法
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),则表达式为未知(即 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);与 IN、ANY 和 SOME 一样,只要满足以下两个条件,就可以将 TABLE 与 ALL 和 NOT 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 编写,因为子查询依赖于列表达式。