ROW子查询
标量或列子查询返回单个值或一列值。行子查询是一个子查询变体返回单个行,因此可以返回多个列值。行子查询比较的合法运算符为:
= > < >= <= <> != <=>
这是两个示例:
SELECT *FROM t1WHERE (col1,col2) = (SELECT col3, col4FROM t2WHERE id = 10);SELECT *FROM t1WHERE ROW (col1,col2) = (SELECT col3, col4FROM t2WHERE id = 10);
对于这两个查询,如果表t2
包含带有的单行id = 10
,则子查询将返回单行。如果该行的col3
和col4
值等于中任何行的col1
和col2
值t1
,则WHERE
表达式为,TRUE
并且每个查询都返回这些t1
行。如果t2
行col3
和col4
值不等于任何行的col1
和col2
值t1
,则表达式为FALSE
并且查询返回空结果集。该表达式是未知的(即,NULL
),如果子查询不产生任何行。如果子查询产生多行,则会发生错误,因为一行子查询最多可以返回一行。
有关每个运算符如何进行行比较的信息,请参见“比较函数和运算符”。
表达式(1,2)
和ROW(1,2)
有时也称为行构造器。两者是等效的。行构造函数和子查询返回的行必须包含相同数量的值。
行构造函数用于与返回两个或更多列的子查询进行比较。当子查询返回单个列时,它被视为标量值而不是行,因此行构造函数不能与不返回至少两列的子查询一起使用。因此,以下查询因语法错误而失败:
SELECT *FROM t1WHERE ROW (1) = (SELECT column1FROM t2)
在其他情况下,行构造器是合法的。例如,以下两个语句在语义上是等效的(并且由优化器以相同的方式处理):
SELECT *FROM t1WHERE (column1,column2) = (1,1);SELECT *FROM t1WHERE column1 = 1 AND column2 = 1;
以下查询回答该请求:“在表t1
中查找表中还存在的所有行t2
”:
SELECT column1,column2,column3FROM t1WHERE (column1,column2,column3)IN (SELECT column1,column2,column3FROM t2);
有关优化器和行构造器的更多信息,请参见“行构造器表达式优化”。