#### 13.2.11.5 行子查询

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

标量或列子查询返回单个值或一列值。一种*行子查询*是返回单行的子查询变体，因此可以返回多个列值。行子查询比较的合法运算符是：

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

这里有两个例子：

```
SELECT * FROM t1
  WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
  WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
```

对于这两个查询，如果表`t2`包含单行`编号 = 10`，子查询返回单行。如果这一行有`col3`和`col4`值等于`col1`和`col2`中任何行的值`t1`， 这`在哪里`表达式是`真的`每个查询都返回那些`t1`行。如果`t2`排`col3`和`col4`值不等于`col1`和`col2`任何值`t1`行，表达式为`错误的`并且查询返回一个空的结果集。表达式是*未知*（那是，`空值`) 如果子查询不产生任何行。如果子查询产生多行，则会发生错误，因为行子查询最多可以返回一行。

有关每个运算符如何用于行比较的信息，请参阅[第 12.4.2 节，“比较函数和运算符”](comparison-operators.html).

表达式`(1,2)`和`行（1,2）`有时称为行构造函数。两者是等价的。行构造函数和子查询返回的行必须包含相同数量的值。

行构造函数用于与返回两列或多列的子查询进行比较。当子查询返回单个列时，这被视为标量值而不是行，因此行构造函数不能与不返回至少两列的子查询一起使用。因此，以下查询因语法错误而失败：

```
SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)
```

行构造函数在其他上下文中是合法的。例如，以下两个语句在语义上是等价的（并且由优化器以相同的方式处理）：

```
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
```

以下查询回答了请求，“查找表中的所有行`t1`也存在于表中`t2`”：

```
SELECT column1,column2,column3
  FROM t1
  WHERE (column1,column2,column3) IN
         (SELECT column1,column2,column3 FROM t2);
```

有关优化器和行构造函数的更多信息，请参阅[第 8.2.1.22 节，“行构造函数表达式优化”](row-constructor-optimization.html)
