文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  行子查询

15.2.15.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 包含一行,其中 id = 10,则子查询返回单行。如果此行中的 col3col4 值等于 t1 中任何行的 col1col2 值,则 WHERE 表达式为 TRUE,并且每个查询都返回这些 t1 行。如果 t2 行的 col3col4 值不等于任何 t1 行的 col1col2 值,则表达式为 FALSE,并且查询返回空结果集。如果子查询不生成任何行,则表达式为 未知(即,NULL)。如果子查询生成多行,则会发生错误,因为行子查询最多只能返回一行。

有关每个运算符如何在行比较中起作用的信息,请参见 第 14.4.2 节,“比较函数和运算符”

表达式 (1,2)ROW(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);

有关优化器和行构造器的更多信息,请参见 第 10.2.1.22 节,“行构造器表达式优化”