带有ANY,IN或SOME的子查询
句法:
operand comparison_operatorANY (subquery) operandIN (subquery) operand comparison_operatorSOME (subquery)
comparison_operator
这些运算符之一在哪里:
= > < >= <= <> !=
该ANY
关键字,它必须遵循一个比较操作符,表示“回报TRUE
如果比较TRUE
的ANY
列的子查询返回的值。”例如:
SELECT s1FROM t1WHERE s1 >ANY (SELECT s1FROM t2);
假设表格t1
中有一行包含(10)
。表达是TRUE
如果表t2
包含(21,14,7)
因为有一个值7
在t2
小于10
。表达式是FALSE
table是否t2
包含(20,10)
,或者table t2
是否为空。如果table 包含,则表达式是未知的(即NULL
)。t2
(NULL,NULL,NULL)
与子查询一起使用时,该词IN
是的别名= ANY
。因此,这两个语句是相同的:
SELECT s1FROM t1WHERE s1 =ANY (SELECT s1FROM t2);SELECT s1FROM t1WHERE s1IN (SELECT s1FROM t2);
IN
与= ANY
表达式列表一起使用时不是同义词。IN
可以获取一个表达式列表,但= ANY
不能。请参见“比较函数和运算符”。
NOT IN
不是的别名<> ANY
,而是的别名<> ALL
。请参见“带有ALL的子查询”。
这个词SOME
是的别名ANY
。因此,这两个语句是相同的:
SELECT s1FROM t1WHERE s1 <>ANY (SELECT s1FROM t2);SELECT s1FROM t1WHERE s1 <>SOME (SELECT s1FROM t2);
这个词SOME
很少使用,但是这个例子说明了为什么它可能有用。对大多数人来说,英语短语“一个不等于任何B-”手段“没有B,其等于,”但这并不是什么是SQL语法的意思。语法的含义是“存在一些b不等于a。”使用<> SOME
,而不是有助于确保每个人都理解该查询的真正含义。
从MySQL 8.0.19开始,可以使用TABLE
在一个标量IN
,ANY
或SOME
子查询中提供的表格只包含一列。如果t2
只有一列,则本节前面显示的语句可以如下所示编写,在每种情况下都替换TABLE t2
为SELECT s1 FROM t2
:
SELECT s1FROM t1WHERE s1 >ANY (TABLE t2);SELECT s1FROM t1WHERE s1 =ANY (TABLE t2);SELECT s1FROM t1WHERE s1IN (TABLE t2);SELECT s1FROM t1WHERE s1 <>ANY (TABLE t2);SELECT s1FROM t1WHERE s1 <>SOME (TABLE t2);