13.2.10.7 상관 서브 쿼리
상관 서브 쿼리는 외부 쿼리에 나타나는 테이블에 대한 참조를 포함 서브 쿼리입니다. 예 :
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
이 서브 쿼리는 서브 쿼리의 FROM
절에서 테이블 t1
이 지정되어 있지 않은 경우에도 t1
의 컬럼에 대한 참조가 포함됩니다. 따라서 MySQL이 서브 쿼리의 외부를 찾아 외부 쿼리에서 t1
을 찾습니다.
테이블 t1
에 column1 = 5
이고 column2 = 6
인 행이 포함되어있는 반면, 테이블 t2
에 column1 = 5
이고 column2 = 7
인 행이 포함되어 있다고합니다. 간단한 식 ... WHERE column1 = ANY (SELECT column1 FROM t2)
는 TRUE
가됩니다 만,이 예에서는 하위 쿼리의 WHERE
절 ( (5,6)
가 (5,7)
에 동일하지 않기 때문에) FALSE
입니다. 따라서 전체적으로 식은 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));
이 문은 SELECT column1 FROM t2 AS x ...
이 t2
의 이름을 변경하기 위해 x.column2
테이블 t2
의 컬럼이어야합니다. SELECT column1 FROM t1 ...
이 또한 외부에있는 외부 쿼리이기 때문에 이것은 테이블 t1
의 컬럼이 없습니다.
HAVING
또는 ORDER BY
절에 서브 쿼리의 경우 MySQL은 외부 선택 목록에서 열 이름을 찾습니다.
어떤 경우는 상관 서브 쿼리가 최적화됩니다. 예 :
val
IN (SELECT key_val
FROM tbl_name
WHERE correlated_condition
)
그렇지 않으면 이러한 비효율적이며 느려질 수 있습니다. 쿼리를 조인으로 다시 작성하면 성능이 향상 될 수 있습니다.
상관 서브 쿼리 내의 집계 함수는 그 함수에 외부 참조 이외에는 아무것도 들어 있지 않고, 한편 그 함수가 다른 함수 나 수식에 포함되어 있지 않은 경우, 외부 참조를 포함 할 수 있습니다.