ITEEDU

13.2.8.4. 使用ALL进行子查询

语法:
operand comparison_operator ALL (subquery)

词语ALL必须接在一个比较操作符的后面。ALL的意思是“对于子查询返回的列中的所有值,如果比较结果为TRUE,则返回TRUE。”例如:

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

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

最后,如果表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);