MySQL 8.4 Release Notes
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);
与 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
,因为子查询依赖于表达式。