Correlated Subqueries
Nested SubQueries
相关子查询是一个子查询中引用了某张表且这张表也在子查询外部被使用到。比如:
SELECT * FROM t1
WHERE column1 IN (
SELECT column1 FROM t2
WHERE t2.column2 = t1.column2);
请注意子查询有一个t1表column2的引用,尽管子查询的from语句中没有涉及t1表,这时mysql执行子查询却发现t1表在外部查询中。
假设表t1有一行数据(column1=5,column2=6),与此同时表t2有一行数据(column1=5,column2=7)。
如果是简单的子查询:
... WHERE column1 = ANY (SELECT column1 FROM t2)
结果将会是true,有数据返回。但是在这个例子中,where子句中的子查询会返回false,查不到任何数据,因为两张表的column2不匹配。
相关子查询
和普通子查询
(也叫非相关子查询
)的差别就在于这子查询中是否有对外部查询中涉及到的表的引用。
规则范围: 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 ...
别名是x,它不是表t1的列是因为SELECT column1 FROM t1 ...
是一个外部查询。它俩中间还隔着一对圆括号。
相关子查询是使用外部查询中的值的子查询(嵌套在另一个查询中的查询)。因为子查询需为外部查询返回的每一行执行一次,所以它可能会很慢。
SELECT employee_number, name
FROM employees emp
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department = emp.department);
在上面的查询中,外部查询为:
SELECT employee_number, name
FROM employees emp
WHERE salary > ...
内部查询(相关子查询)为:
SELECT AVG(salary)
FROM employees
WHERE department = emp.department
在上面的嵌套查询中,须为每个员工重新执行内部查询。
看完官方和Wiki的解释,对相关子查询的描述基本一样,用自己的话说就是:
相关子查询被用来做逐行的处理,子查询会为外部查询出来的每一行执行内部SQL。(外部语句也可为update或delete语句)
可拆分成下面三个步骤:
原文:https://www.cnblogs.com/mrcharleshu/p/13174028.html