Documentation Home

13.2.10.7 相关子查询

相关子查询是包含对也出现在外部查询中的表的引用的子查询 。例如:

SELECT * FROM t1
  WHERE column1 = ANY (SELECT column1 FROM t2
                       WHERE t2.column2 = t1.column2);

请注意,子查询包含对列的引用 t1,即使子查询的 FROM子句未提及表 t1。因此,MySQL 在子查询之外查找,并t1在外部查询中查找。

假设该表t1包含一行,其中 column1 = 5column2 = 6;同时,表t2包含一行,其中column1 = 5column2 = 7。简单的表达式... WHERE column1 = ANY (SELECT column1 FROM t2)TRUE,但在这个例子中, WHERE子查询中的子句是 FALSE(因为(5,6)不等于(5,7)),所以整个表达式是FALSE

作用域规则: MySQL 从内到外计算。例如:

SELECT column1 FROM t1 AS x
  WHERE x.column1 = (SELECT column1 FROM t2 AS x
    WHERE x.column1 = (SELECT column1 FROM t3
      WHERE x.column2 = t3.column1));

在此语句中,x.column2必须是表中的列,t2因为SELECT column1 FROM t2 AS x ...重命名t2。它不是表中的列,t1因为 它是一个更远SELECT column1 FROM t1 ...的外部查询。

对于HAVINGorORDER BY子句中的子查询,MySQL 还会在外部选择列表中查找列名。

对于某些情况,优化了相关子查询。例如:

val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)

否则,它们效率低下并且可能很慢。将查询重写为连接可能会提高性能。

相关子查询中的聚合函数可能包含外部引用,前提是该函数只包含外部引用,并且该函数不包含在另一个函数或表达式中。