• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ROW子查询

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

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

    这是两个示例:

    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值等于中任何行的col1col2t1,则WHERE表达式为,TRUE并且每个查询都返回这些t1行。如果t2col3col4值不等于任何行的col1col2t1,则表达式为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);
    

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