ALL子查询
句法:
operand comparison_operatorALL (subquery)
这个词ALL
,它必须遵循一个比较操作符,表示“回报TRUE
如果比较TRUE
的ALL
列的子查询返回的值。”例如:
SELECT s1FROM t1WHERE s1 >ALL (SELECT s1FROM t2);
假设表格t1
中有一行包含(10)
。表达式是TRUE
if table t2
包含,(-5,0,+5)
因为10
它大于中的所有三个值t2
。表达是FALSE
如果表t2
包含(12,6,NULL,-100)
,因为有一个单一的值12
在表t2
是大于10
。如果table 包含,则表达式是未知的(即NULL
)。t2
(0,NULL,1)
最后,表达式是TRUE
if 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
因为子查询取决于列表达式。