标量或列子查询返回单个值或一列值。行子查询是子查询的变体,返回单行,可以返回多个列值。行子查询比较的合法运算符包括:
1. = > < >= <= <> != <=>
两个例子:
1. SELECT * FROM t1
2. WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
3. SELECT * FROM t1
4. WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
对于这两个查询,如果表 t2 包含 id = 10 的一行记录,则子查询返回一行。如果此行的 col3 和 col4 值等于 t1 中任何行的 col1 和 col2 值,则 WHERE 表达式为 TRUE,并且每个查询都返回这些 t1 行。如果 t2 行 col3 和 col4 的值不等于任何 t1 行的 col1 和 col2 值,则表达式为 FALSE,查询返回空结果集。如果子查询不生成行,则表达式是未知的(即 NULL)。如果子查询生成多行,则发生错误,因为行子查询最多只能返回一行。
表达式 (1,2) 和 ROW(1,2) 有时称为行构造函数,两者相等。行构造函数和子查询返回的行必须包含相同数量的值。
行构造函数用于比较有两个或两个以上列的子查询。当子查询返回单个列时,这将被视为标量值而不是行,因此如果不返回至少两列,则不能将行构造函数用于这样的子查询。以下查询因语法错误而失败:
1. SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)
行构造函数在其他上下文中是合法的。例如,以下两个语句在语义上是等价的(并且由优化器以相同的方式处理):
1. SELECT * FROM t1 WHERE (column1,column2) = (1,1);
2. SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
下面的查询回答了“查找存在于表 t1 中,也存在于表 t2 中的所有行”的请求:
1. SELECT column1,column2,column3
2. FROM t1
3. WHERE (column1,column2,column3) IN
4. (SELECT column1,column2,column3 FROM t2);
官方网址:
https://dev.mysql.com/doc/refman/8.0/en/row-subqueries.html