13.2.10.3 带有 ANY,IN 或 SOME 的子查询
Syntax:
operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)
其中* comparison_operator
*是以下运算符之一:
= > < >= <= <> !=
关键字ANY
(必须紧跟比较运算符之后)table 示“如果子查询返回的列中的值ANY
的比较是TRUE
,则返回TRUE
”。例如:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
假设 tablet1
中有一行包含(10)
。如果 tablet2
包含(21,14,7)
,则 table 达式为TRUE
,因为t2
中的值7
小于10
。如果 tablet2
包含(20,10)
或 tablet2
为空,则 table 达式为FALSE
。如果 tablet2
包含(NULL,NULL,NULL)
,则 table 达式为* unknown *(即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
与 table 达式列 table 一起使用时不是同义词。 IN
可以接受 table 达式列 table,但= ANY
不能。参见第 12.3.2 节“比较函数和运算符”。
NOT IN
不是<> ANY
的别名,而是<> ALL
的别名。参见第 13.2.10.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”的意思是“不存在等于 a 的 b”,但这不是 SQL 语法的含义。语法的含义是“存在一些 b 不等于 a”。使用<> SOME
可以帮助确保每个人都了解查询的真实含义。