关联子查询是一个子查询,它包含对同时出现在外部查询中的表的引用。例如:
1.SELECT * FROM t1
2. WHERE column1 = ANY (SELECT column1 FROM t2
3. WHERE t2.column2 = t1.column2);
请注意,子查询包含对 t1 列的引用,即使子查询的 FROM 子句没有提到表 t1。因此,MySQL 在子查询之外查找,在外部查询中找到 t1。
假设表 t1 包含一行,其中 column1 = 5 并且 column2 = 6;同时,表 t2 包含 column1 = 5 并且 column2 = 7 的行。简单的表达式 ... WHERE column1 = ANY (SELECT column1 FROM t2) 将为 TRUE,但在本例中,子查询中的 WHERE 子句为 FALSE(因为 (5,6) 不等于 (5,7)),因此整个表达式为 FALSE。
作用域规则:MySQL 从内部到外部进行计算。例如:
1.SELECT column1 FROM t1 AS x
2. WHERE x.column1 = (SELECT column1 FROM t2 AS x
3. WHERE x.column1 = (SELECT column1 FROM t3
4. WHERE x.column2 = t3.column1));
在这个语句中,x.column2 必须是表 t2 中的一列,因为 SELECT column1 FROM t2 AS x ... 重命名了 t2。它不是表 t1 中的列,因为 SELECT column1 FROM t1 ... 是一个更远的外部查询。
官方网址:
https://dev.mysql.com/doc/refman/8.0/en/correlated-subqueries.html