句法:
operand comparison_operator ALL (subquery)
单词ALL
必须跟在比较运算符之后,意思是“如果比较是针对子查询返回
的列中的值,则返回。TRUE
TRUE
ALL
”
例如:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
假设表中有一行t1
包含(10)
。表达式是
TRUE
if table t2
contains
(-5,0,+5)
because 10
is greater than all three values in t2
. 表达式是FALSE
if table
t2
contains
因为table中(12,6,NULL,-100)
有一个值大于。如果表包含
,则表达式
未知(即) 。
12
t2
10
NULL
t2
(0,NULL,1)
最后,表达式是TRUE
if table
t2
is empty。所以,下面的表达式是
TRUE
当表t2
为空时:
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
但是这个表达式是NULL
当表
t2
为空时:
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
另外,下面的表达式是NULL
表t2
为空的时候:
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
,您就可以使用
TABLE
withALL
和
: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