MySQL的SQL语句 - 数据操作语句(13)- 子查询(6)

行子查询

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

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

MySQL的SQL语句 - 数据操作语句(13)- 子查询(6)

上一篇:MySQL的SQL语句 - 数据操作语句(12)- SELECT 语句(3)


下一篇:【PHP】一个简单的验证码类