行子查询

 标量或列子查询返回单个值或一列值。行子查询是子查询的变体,返回单行,可以返回多个列值。行子查询比较的合法运算符包括: 


=  >  <  >=  <=  <>  !=  <=>
 
两个例子: 




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 的一行记录,则子查询返回一行。如果此行的 col3 和 col4 值等于 t1 中任何行的 col1 和 col2 值,则WHERE 表达式为 TRUE,并且每个查询都返回这些 t1 行。如果 t2 行 col3和 col4 的值不等于任何 t1 行的 col1 和 col2 值,则表达式为 FALSE,查询返回空结果集。如果子查询不生成行,则表达式是未知的(即 NULL)。如果子查询生成多行,则发生错误,因为行子查询最多只能返回一行。 表达式 (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);