13.2.10.4 全部查询
Syntax:
operand comparison_operator ALL (subquery)
必须在比较运算符之后的单词ALL
table 示“如果子查询返回的列中的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);