13.2.10.4 全部查询

Syntax:

operand comparison_operator ALL (subquery)

必须在比较运算符之后的单词ALLtable 示“如果子查询返回的列中的ALL的值是TRUE,则返回TRUE”。例如:

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

假设 tablet1中有一行包含(10)。如果 tablet2包含(-5,0,+5),则 table 达式为TRUE,因为10大于t2中的所有三个值。如果 tablet2包含(12,6,NULL,-100),则 table 达式为FALSE,因为 tablet2中只有一个值12大于10。如果 tablet2包含(0,NULL,1),则 table 达式为* unknown *(即NULL)。

最后,如果 tablet2为空,则 table 达式为TRUE。因此,当 tablet2为空时,以下 table 达式为TRUE

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

但是当 tablet2为空时,该 table 达式为NULL

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

此外,当 tablet2为空时,以下 table 达式为NULL

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

通常,包含NULL的 table 和空 table是“边缘情况”。编写子查询时,请始终考虑是否已考虑到这两种可能性。

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