상관 서브쿼리(Correlated Subquery)란?
외부 쿼리(outer query)에도 등장하는 테이블을 내부의 서브쿼리(subquery)가 다시 참조하는 형태의 쿼리를 상관 서브쿼리(correlated subquery)라고 합니다. 이런 경우 MySQL은 일반적으로 내부 쿼리를 먼저 평가한 후, 그 결과를 바탕으로 외부 쿼리를 평가합니다.
이해를 돕기 위해 'cars' 테이블에 저장된 다음 데이터를 예로 들어 살펴보겠습니다.
mysql> Select * from Cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.02 sec)
예시 1: 평균 가격보다 낮은 차량 조회하기
아래는 서브쿼리와 외부 쿼리 양쪽에서 모두 'Cars' 테이블을 참조하는 MySQL 쿼리입니다.
mysql> Select Name from cars WHERE Price < (SELECT AVG(Price) from Cars); +--------------+ | Name | +--------------+ | Nexa | | Maruti Swift | | Alto | | Skoda | | Ford | +--------------+ 5 rows in set (0.00 sec)
위 쿼리에서 MySQL은 먼저 내부 쿼리인 Select AVG(Price) from Cars를 실행하여 전체 차량의 평균 가격을 계산합니다. 그다음 이 평균값을 기준으로 외부 쿼리인 Select Name from Cars Where Price <를 평가하여, 평균 가격보다 저렴한 5개 차량의 이름을 반환합니다.
예시 2: 평균 가격보다 높은 차량 조회하기
비교 연산자만 반대로 변경하면 평균 가격보다 비싼 차량도 손쉽게 조회할 수 있습니다. 아래 쿼리 역시 앞선 예시와 마찬가지로 내부 쿼리부터 먼저 평가됩니다.
mysql> Select Name from cars WHERE Price > (SELECT AVG(Price) from Cars); +--------+ | Name | +--------+ | BMW | | VOLVO | | Toyota | +--------+ 3 rows in set (0.00 sec)
정리
이처럼 서브쿼리가 외부 쿼리와 동일한 테이블을 참조하더라도 문제없이 동작하며, MySQL은 내부 쿼리 → 외부 쿼리 순서로 평가를 진행합니다. 평균값 집계와 비교 연산자를 조합하면 데이터셋 전체의 기준값 대비 조건에 맞는 행을 간결하게 필터링할 수 있다는 점이 핵심입니다.