Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.2 数据操作语句  / 13.2.11 子查询  /  13.2.11.4 带有 ALL 的子查询

13.2.11.4 带有 ALL 的子查询

句法:

operand comparison_operator ALL (subquery)

单词ALL必须跟在比较运算符之后,意思是如果比较是针对子查询返回 的列中的值,则返回。TRUETRUEALL 例如:

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

假设表中有一行t1 包含(10)。表达式是 TRUEif table t2contains (-5,0,+5)because 10is greater than all three values in t2. 表达式是FALSEif table t2contains 因为table中(12,6,NULL,-100)有一个值大于。如果表包含 ,则表达式 未知(即) 。 12t210NULLt2(0,NULL,1)

最后,表达式是TRUEif table t2is empty。所以,下面的表达式是 TRUE当表t2为空时:

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

但是这个表达式是NULL当表 t2为空时:

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

另外,下面的表达式是NULLt2为空的时候:

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);

MySQL 8.0.19 支持该TABLE 语句。与IN, ANY, 和一样,只要满足以下两个条件 SOME,您就可以使用 TABLEwithALL和 :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);因此无法编写 using 等查询。TABLE t2