ALL子查询
句法:
operand comparison_operatorALL (subquery)
这个词ALL,它必须遵循一个比较操作符,表示“回报TRUE如果比较TRUE的ALL列的子查询返回的值。”例如:
SELECT s1FROM t1WHERE s1 >ALL (SELECT s1FROM t2);
假设表格t1中有一行包含(10)。表达式是TRUEif table t2包含,(-5,0,+5)因为10它大于中的所有三个值t2。表达是FALSE如果表t2包含(12,6,NULL,-100),因为有一个单一的值12在表t2是大于10。如果table 包含,则表达式是未知的(即NULL)。t2(0,NULL,1)
最后,表达式是TRUEif table t2为空。因此,TRUE当表t2为空时,以下表达式是:
SELECT *FROM t1WHERE 1 >ALL (SELECT s1FROM t2);
但是此表达式是NULL当表t2为空时:
SELECT *FROM t1WHERE 1 > (SELECT s1FROM t2);
此外,NULL当表t2为空时,以下表达式是:
SELECT *FROM t1WHERE 1 >ALL (SELECT MAX(s1)FROM t2);
通常,包含NULL值的表和空表都是“极端情况”。”当编写子查询,总是考虑是否采取了这两种可能性考虑在内。
NOT IN是的别名<> ALL。因此,这两个语句是相同的:
SELECT s1FROM t1WHERE s1 <>ALL (SELECT s1FROM t2);SELECT s1FROM t1WHERE s1 NOTIN (SELECT s1FROM t2);
MySQL 8.0.19支持该TABLE语句。与IN,ANY和和一样SOME,您可以TABLE与ALL和一起使用,NOT IN只要满足以下两个条件:
- 子查询中的表仅包含一列
 - 子查询不依赖于列表达式
 
例如,假设该表t2由单个列组成,则可以使用TABLE t2以下方式编写前面显示的最后两个语句:
SELECT s1FROM t1WHERE s1 <>ALL (TABLE t2);SELECT s1FROM t1WHERE s1 NOTIN (TABLE t2);
查询诸如SELECT * FROM t1 WHERE 1 > ALL(SELECT MAX(s1)FROM t2);不能使用被写入TABLE t2因为子查询取决于列表达式。
