#### 13.2.11.3带有ANY、IN或SOME的子查询

[](<>)[](<>)[](<>)[](<>)

语法：

```
operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)
```

哪里*`比较算子`*是以下运营商之一：

```
=  >  <  >=  <=  <>  !=
```

这个`任何`关键字必须跟在比较运算符后面，意思是“return”`符合事实的`如果比较是正确的`符合事实的`对于`任何`子查询返回的列中的值。”例如：

```
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
```

假设表中有一行`t1`包含`(10)`.表达方式是`符合事实的`如果桌子`t2`包含`(21,14,7)`因为有一个价值`7`在`t2`小于`10`.表达式是`错误的`如果表`t2`包含`(20,10)`, 或者如果表`t2`是空的。表达式是*未知*（那是，`空值`) 如果表`t2`包含`（空，空，空）`.

当与子查询一起使用时，单词`在`是一个别名`= 任何`.因此，这两个语句是相同的：

```
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);
```

`在`和`= 任何`与表达式列表一起使用时不是同义词。`在`可以采用表达式列表，但是`= 任何`不能。看[第 12.4.2 节，“比较函数和运算符”](comparison-operators.html).

`不在`不是的别名`<> 任何`， 但对于`<> 全部`.看[第 13.2.11.4 节，“ALL 子查询”](all-subqueries.html).

这个单词`一些`是的别名`任何`因此，这两种说法是相同的：

```
SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
```

这个词的用法`一些`很少见，但这个例子说明了为什么它可能有用。对大多数人来说，英语短语“a不等于任何b”的意思是“没有b等于a”，但这不是SQL语法的意思。该语法的意思是“有一些b与a不相等”使用`<>一些`相反，这有助于确保每个人都理解查询的真正含义。

从MySQL 8.0.19开始，您可以使用[`桌子`](table.html)在标量中`在里面`,`任何`或`一些`子查询，前提是表只包含一列。如果`t2`只有一列，本节前面所示的语句可以按此处所示编写，在每种情况下替换为`表t2`对于`从t2中选择s1`:

```
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);
```
