相关子查询
相关子查询是包含要也出现在外部查询表的基准的子查询。例如:
SELECT *FROM t1WHERE column1 =ANY (SELECT column1FROM t2WHERE t2.column2 = t1.column2);
请注意t1
,即使子查询的FROM
子句未提及table ,子查询仍包含对的列的引用t1
。因此,MySQL在子查询之外查找,并t1
在外部查询中查找。
假设该表t1
包含一行where 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从内到外进行评估。例如:
SELECT column1FROM t1AS xWHERE x.column1 = (SELECT column1FROM t2AS xWHERE x.column1 = (SELECT column1FROM t3WHERE x.column2 = t3.column1));
在此语句中,x.column2
必须是表中的一列,t2
因为SELECT column1 FROM t2 AS x ...
重命名t2
。它不是表中的列,t1
因为它SELECT column1 FROM t1 ...
是一个外部查询,它更远。