본문 바로가기
개발

[MySQL] 서브 쿼리(하위 질의)

by 솜씨제이 2018. 8. 22.

서브 쿼리는 하위 질의라고도 하며 다른 명령문 내의 SELECT 명령문이다.

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

이 예에서 SELECT * FROM t1 ...은 외부 쿼리(또는 외부 문)이고 (SELECT column1 FROM t2)는 서브 쿼리라고 한다. 서브 쿼리는 상당히 깊이 중첩될 수 있으며 항상 괄호 안에 적어야 한다.

서브 쿼리의 이점은 다음과 같다.

  • 명령문의 각 부분을 격리해서 구조화된 쿼리를 가능하게 한다.
  • 복잡한 join이나 union을 대체할 수 있다.
  • 많은 사람이 서브 쿼리를 복잡한 join이나 union보다 쉽게 읽을 수 있다.

서브 쿼리가 어떤 행이든 반환하면 EXISTS는 TRUE, NOT EXISTS는 FALSE가 된다.

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

EXISTS 서브 쿼리는 보통 SELECT *로 시작하지만 MySQL은 이 SELECT 목록을 무시하기 때문에 SELECT 1, SELECT col1 등의 다른 형태로 시작해도 상관 없다.

MySQL은 쿼리를 외부에서 내부로 평가한다. 먼저 외부 쿼리의 값을 구하고 서브 쿼리를 평가하기 때문에 서브 쿼리의 성능이 좋지 않을 수 있다. 따라서 INNER JOIN을 사용하거나 1:n 관계인 경우 EXISTS를 사용해서 최적화할 수 있다. EXISTS는 서브 쿼리를 만족하는 최초 값을 발견하면 평가를 중단하고 TRUE나 FALSE(NOT EXIST)를 반환한다.

댓글