MySQL 8.3 Release Notes
语法:
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);
与 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
编写,因为子查询依赖于列表达式。