Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

외부 쿼리와 같은 테이블을 참조하는 서브쿼리(상관 서브쿼리) 활용 방법

상관 서브쿼리(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은 내부 쿼리 → 외부 쿼리 순서로 평가를 진행합니다. 평균값 집계와 비교 연산자를 조합하면 데이터셋 전체의 기준값 대비 조건에 맞는 행을 간결하게 필터링할 수 있다는 점이 핵심입니다.