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

MySQL 서브쿼리에서 ALL, ANY, SOME, IN 연산자 완벽 가이드

MySQL 서브쿼리 비교 연산자란?

MySQL에서 ALL, ANY, SOME, IN 연산자는 서브쿼리(subquery)가 반환하는 값들과 피연산자(operand)를 비교하는 데 사용됩니다. 이 네 가지 연산자는 모두 반드시 비교 연산자(=, <>, >, >=, <, <=) 뒤에 위치해야 하며, 서브쿼리의 결과 집합과 비교하는 방식에 따라 각각 다른 의미를 가집니다.

각 연산자별 사용 문법

'ALL' 연산자

Operand comparison_operator ALL (subquery)

'ALL'은 서브쿼리가 반환하는 모든 값과의 비교 조건이 참일 때만 결과를 반환합니다.

'ANY' 연산자

Operand comparison_operator ANY (subquery)

'ANY'는 서브쿼리가 반환하는 값 중 하나라도 비교 조건을 만족하면 결과를 반환합니다.

'SOME' 연산자

Operand comparison_operator SOME (subquery)

'SOME'은 'ANY'와 완전히 동일하게 동작하며, 서브쿼리 결과 중 하나라도 조건을 만족하면 참이 됩니다.

'IN' 연산자

Operand comparison_operator IN (subquery)

'IN'은 서브쿼리 결과 목록에 해당 값이 포함되어 있는지 확인하며, '= ANY'와 같은 의미로 사용됩니다.

예제 데이터 준비

다음 두 개의 테이블을 사용하여 각 연산자의 실제 동작을 살펴보겠습니다.

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)

Customers 테이블에는 4명의 고객 정보가 있고, Reservations 테이블에는 고객 ID 1, 2, 3번의 예약 기록이 저장되어 있습니다. 즉, 4번 고객(Virender)만 예약 내역이 없는 상태입니다.

연산자별 실행 예제

'ALL' 연산자 예제

아래 쿼리는 'ALL' 연산자를 사용하여 서브쿼리가 반환한 모든 customer_id 값과 일치하지 않는 고객을 조회합니다.

mysql> SELECT customer_id from Customers WHERE customer_id <> ALL(Select customer_id from reservations);
+-------------+
| customer_id |
+-------------+
|           4 |
+-------------+
1 row in set (0.00 sec)

예약 기록이 있는 고객 ID는 1, 2, 3입니다. 따라서 이 모든 값과 일치하지 않는 4번 고객만 결과로 반환되었습니다.

'ANY' 연산자 예제

아래 쿼리는 'ANY' 연산자를 사용하여 서브쿼리 결과 중 하나라도 일치하는 고객을 조회합니다.

mysql> SELECT customer_id from customers WHERE customer_id = ANY(Select customer_id from reservations);
+-------------+
| customer_id |
+-------------+
|           1 |
|           2 |
|           3 |
+-------------+
3 rows in set (0.00 sec)

예약 기록이 존재하는 고객 ID인 1, 2, 3번이 그대로 반환되었습니다.

'SOME' 연산자 예제

'SOME'은 'ANY'와 동일한 의미를 가지므로, 아래 쿼리 역시 앞선 예제와 같은 결과를 반환합니다.

mysql> SELECT customer_id from customers WHERE customer_id = Some(Select customer_id from reservations);
+-------------+
| customer_id |
+-------------+
|           1 |
|           2 |
|           3 |
+-------------+
3 rows in set (0.00 sec)

'IN' 연산자 예제

'IN' 연산자는 '= ANY'와 동일한 결과를 제공합니다. 아래 쿼리도 같은 결과를 출력합니다.

mysql> SELECT customer_id from customers WHERE customer_id IN (Select customer_id from reservations);
+-------------+
| customer_id |
+-------------+
|           1 |
|           2 |
|           3 |
+-------------+
3 rows in set (0.00 sec)

핵심 정리

ALL: 서브쿼리의 모든 값과 비교 조건이 참이어야 결과 반환
ANY / SOME: 서브쿼리의 값 중 하나라도 조건을 만족하면 참
IN: 서브쿼리 결과 목록에 값이 포함되어 있으면 참 ('= ANY'와 동일)

이처럼 네 가지 연산자는 서브쿼리 결과와 메인 쿼리의 값을 비교하는 강력한 도구이며, 데이터 분석 시 조건 필터링에 매우 유용하게 활용됩니다.