MySQL에서는 IN 키워드와 함께 서브쿼리(subquery)를 사용하여 데이터를 효과적으로 필터링할 수 있습니다. 그 이유는 한 쿼리의 실행 결과를 마치 값의 목록처럼 활용하여, IN 연산자와 함께 다른 쿼리의 결과를 기반으로 데이터를 걸러낼 수 있기 때문입니다. 이때 서브쿼리는 IN 키워드 뒤에 오는 괄호 안에 작성됩니다.
예제
다음 두 개의 테이블 데이터를 사용하여 예제를 살펴보겠습니다.
mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec) mysql> Select * from Reservations; +------+-------------+------------+ | ID | Customer_id | Day | +------+-------------+------------+ | 1 | 1 | 2017-12-30 | | 2 | 2 | 2017-12-28 | | 3 | 2 | 2017-12-29 | | 4 | 1 | 2017-12-25 | | 5 | 3 | 2017-12-26 | +------+-------------+------------+ 5 rows in set (0.00 sec)
아래 쿼리는 IN 연산자와 서브쿼리를 함께 사용합니다. 서브쿼리가 반환한 모든 customer_id 값을 비교한 후, 해당 조건에 일치하는 고객 정보만 결과로 반환합니다.
mysql> SELECT * from customers WHERE customer_id IN (Select customer_id from reservations); +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | +-------------+----------+ 3 rows in set (0.00 sec)
결과 분석
서브쿼리 Select customer_id from reservations는 예약 테이블에 존재하는 고객 ID인 1, 2, 3을 반환합니다. 따라서 외부 쿼리는 Customers 테이블에서 이 세 개의 ID에 해당하는 고객(Rahul, Yashpal, Gaurav)만 조회하게 됩니다. 반면, 예약 기록이 없는 4번 고객(Virender)은 결과에서 제외되는 것을 확인할 수 있습니다.
이처럼 IN 연산자와 서브쿼리를 조합하면 JOIN을 사용하지 않고도 두 테이블 간의 관계를 기반으로 손쉽게 데이터를 필터링할 수 있습니다.