[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ALL
Syntax:
<operand> <comparison operator> ALL (<subquery>) |
The word ALL
, which must follow a comparison operator, means
"return TRUE
if the comparison is TRUE
for ALL
of
the rows that the subquery returns".
For example,
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2); |
Suppose that there is a row in table t1
containing {10}.
The expression is TRUE
if table t2
contains {-5,0,+5}
because all three values in t2
are less than 10.
The expression is FALSE
if table t2
contains
{12,6,NULL,-100} because there is a single value in table t2
-- 12
-- which is greater than 10.
The expression is UNKNOWN
if table t2
contains {0,NULL,1}.
Finally, if table t2
is empty, the result is TRUE
.
You might think the result should be UNKNOWN
, but
sorry, it's TRUE
. So, rather oddly,
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2); |
is TRUE
when table t2
is empty, but
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2); |
is UNKNOWN
when table t2
is empty. In addition,
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2); |
is UNKNOWN
when table t2
is empty.
In general, tables with NULLs and empty tables are
edge cases -- when writing subquery code, always consider whether
you have taken those two possibilities into account.