MySQL에서는 WHERE 절에서 연산자와 함께 서브쿼리의 결과를 활용할 수 있는 것처럼, FROM 절에서도 서브쿼리를 하나의 테이블처럼 사용할 수 있습니다. 이를 파생 테이블(Derived Table) 또는 인라인 뷰라고 부르며, 복잡한 쿼리를 단계별로 나누어 처리할 때 매우 유용합니다.
FROM 절 서브쿼리의 기본 문법
FROM 절에 서브쿼리를 작성할 때는 반드시 별칭(Alias)을 붙여야 합니다. 별칭이 없으면 MySQL이 해당 결과 집합을 참조할 수 없어 오류가 발생합니다. 아래 예제에서는 'C_car'라는 별칭을 사용했습니다.
예제 데이터 확인
먼저 예제로 사용할 '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)
서브쿼리를 테이블로 사용한 조회
아래 쿼리는 가격이 200,000보다 큰 차량을 먼저 서브쿼리로 추출한 뒤, 그 결과를 'C_car'라는 임시 테이블처럼 취급하여 이름이 'Nexa'인 행만 다시 필터링하는 예제입니다.
mysql> Select * FROM ( Select Name, Price from Cars Where Price > 200000) C_car WHERE Name = 'Nexa'; +------+--------+ | Name | Price | +------+--------+ | Nexa | 750000 | +------+--------+ 1 row in set (0.00 sec)
쿼리 실행 순서 이해하기
이 쿼리는 다음과 같은 순서로 동작합니다.
1. 내부 서브쿼리가 먼저 실행되어 가격이 200,000을 초과하는 차량 목록(Nexa, BMW, VOLVO, Toyota)을 생성합니다.
2. 생성된 결과 집합이 'C_car'라는 별칭을 가진 임시 테이블이 됩니다.
3. 외부 쿼리가 'C_car' 테이블에서 Name이 'Nexa'인 행만 최종적으로 반환합니다.
정리
FROM 절의 서브쿼리를 활용하면 집계 결과에 대한 추가 필터링, 조인 전 사전 가공 등 복잡한 데이터 처리를 논리적으로 구성할 수 있습니다. 단, 서브쿼리 뒤에는 반드시 별칭을 지정해야 한다는 점을 기억하세요.