MySQL 9.0 发行说明
语法
operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)
其中 comparison_operator
是以下运算符之一
= > < >= <= <> !=
ANY
关键字必须位于比较运算符之后,表示 “如果子查询返回的列中的 ANY
值都满足比较条件,则返回 TRUE
。” 例如
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
假设表 t1
中有一行包含 (10)
。如果表 t2
包含 (21,14,7)
,则该表达式为 TRUE
,因为 t2
中存在一个值 7
小于 10
。如果表 t2
包含 (20,10)
,或者表 t2
为空,则该表达式为 FALSE
。如果表 t2
包含 (NULL,NULL,NULL)
,则该表达式为 未知(即 NULL
)。
与子查询一起使用时,IN
是 = ANY
的别名。因此,以下两个语句是相同的
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
IN
和 = ANY
在与表达式列表一起使用时不是同义词。 IN
可以接受表达式列表,但 = ANY
不行。请参阅 第 14.4.2 节,“比较函数和运算符”.
NOT IN
不是 <> ANY
的别名,而是 <> ALL
的别名。参见 第 15.2.15.4 节,“带 ALL 的子查询”。
单词 SOME
是 ANY
的别名。因此,以下两个语句是相同的
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
使用单词 SOME
很少见,但此示例说明了它可能很有用的原因。对大多数人来说,英语短语 “a 不等于任何 b” 的意思是 “没有一个 b 等于 a”,但这并不是 SQL 语法所指的意思。语法的意思是 “存在一个 b 不等于 a。” 使用 <> SOME
代替有助于确保每个人都理解查询的真正含义。
你可以在标量 IN
、ANY
或 SOME
子查询中使用 TABLE
,前提是该表只包含一列。如果 t2
只有一个列,那么本节前面显示的语句可以按如下方式编写,在每种情况下用 TABLE t2
代替 SELECT s1 FROM t2
SELECT s1 FROM t1 WHERE s1 > ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 = ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 IN (TABLE t2);
SELECT s1 FROM t1 WHERE s1 <> ANY (TABLE t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (TABLE t2);