我一直认为子查询只是嵌套在另一个查询中的查询。
相关子查询是使用外部查询中的列的子查询。
我认为,这里的文档似乎支持该想法。
https://dev.mysql.com/doc/refman/8.0/en/correlated-subqueries.html
现在,让我困惑的那一部分。
我正在阅读,
https://dev.mysql.com/doc/refman/8.0/en/derived-tables.html
具体地说,
派生表不能是相关子查询。
然后
在MySQL 8.0.14之前,派生表不能包含外部引用。这是MySQL 8.0.14中取消的MySQL限制,而不是SQL标准的限制。例如,以下查询中的派生表dt包含对外部查询中的表
t1.b
的引用t1
:SELECT * FROM t1 WHERE t1.d > (SELECT AVG(dt.a) FROM (SELECT SUM(t2.a) AS a FROM t2 WHERE t2.b = t1.b GROUP BY t2.c) dt WHERE dt.a > 10);
它表示派生表不能是相关子查询。因此,它不能使用外部查询中的列。
然后,它说解除了限制,它可以使用外部查询中的列。
我在这里误会/误读了什么吗?
[编辑]
我再三考虑,我认为我明白了。 (不太确定)。
所以,我认为有两种派生表作为相关子查询。
一个引用相同 FROM/JOIN
子句中的表。
SELECT
*
FROM
sameFromClauseTable
JOIN
--This derived table references `sameFromClauseTable.sameFromClauseColumn`
(
SELECT
*
FROM
innerTable
WHERE
--This expression references `sameFromClauseTable.sameFromClauseColumn`
sameFromClauseTable.sameFromClauseColumn > innerTable.innerColumn
) AS derivedTable
LATERAL
一起使用 父级 FROM/JOIN
子句中的其他引用表。
SELECT
*
FROM
parentQueryTable
WHERE
--This is a subquery
EXISTS (
SELECT
*
FROM
--This derived table references `parentQueryTable.parentQueryColumn`
(
SELECT
*
FROM
innerTable
WHERE
--This expression references `parentQueryTable.parentQueryColumn`
parentQueryTable.parentQueryColumn > innerTable.innerColumn
) AS derivedTable
)
我实际上没有运行任何这些查询,因此我可能完全错了。我希望有人可以检查一下我是否在正确的轨道上。