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

MySQL 서브쿼리(IN 연산자)로 데이터 필터링하는 방법

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을 사용하지 않고도 두 테이블 간의 관계를 기반으로 손쉽게 데이터를 필터링할 수 있습니다.