MySQL에서는 EXISTS 연산자를 사용하여 하위 쿼리(subquery)에 레코드가 존재하는지 테스트할 수 있습니다. 즉, EXISTS 연산자는 하위 쿼리가 하나 이상의 행을 반환하는지 검사하는 역할을 합니다.
EXISTS 연산자 문법
WHERE EXISTS (Subquery)
위의 EXISTS (subquery) 표현식은 하위 쿼리가 최소 한 개 이상의 행을 반환하면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.
예제
EXISTS 연산자의 동작을 이해하기 위해 아래 두 개의 테이블 데이터를 사용해 보겠습니다.
Customers 테이블:
mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec)
Reservations 테이블:
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)
EXISTS를 활용한 하위 쿼리 예시
위 두 테이블에 EXISTS 연산자를 적용한 MySQL 하위 쿼리는 다음과 같습니다.
mysql> Select Name from customers WHERE EXISTS (SELECT * FROM Reservations WHERE Customers.customer_id = Reservations.customer_id); +---------+ | Name | +---------+ | Rahul | | Yashpal | | Gaurav | +---------+ 3 rows in set (0.06 sec)
위 쿼리는 예약 내역이 있는 고객들의 이름만 반환합니다. 하위 쿼리가 각 고객에 대해 예약 기록의 존재 여부를 확인하고, 레코드가 존재하는 경우에만 해당 고객의 이름이 결과에 포함됩니다. 반면 Virender는 예약 기록이 없기 때문에 결과에서 제외된 것을 확인할 수 있습니다.