[sql] IN, Equal(=), EXISTS

·

2 min read

1️⃣ IN 연산자의 역할

IN 연산자는 여러 개의 값을 포함하는 조건을 만들 때 사용된다.
즉, WHERE 컬럼 IN (값1, 값2, 값3, ...) 형태로 특정 컬럼이 서브쿼리의 결과 중 하나와 일치하는지 확인한다.

예제: IN을 사용한 서브쿼리

SELECT film_id, title
FROM film
WHERE film_id IN (
    SELECT inventory.film_id
    FROM rental
    INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
    WHERE return_date BETWEEN '2005-05-29' AND '2005-05-30'
)
ORDER BY title;

📌 설명:

  • 서브쿼리는 여러 개의 film_id를 반환할 수 있음 (예: 101, 305, 502 등)

  • IN 연산자를 사용하여 film 테이블에서 film_id가 서브쿼리 결과에 포함된 영화만 선택

  • 결과적으로, 반납된 영화 목록만 조회 가능

2️⃣ =(Equal) 연산자와 IN의 차이

IN을 사용해야 하는 이유는, 서브쿼리가 단일 값이 아니라 여러 개의 값(행)을 반환하기 때문이다.
만약 서브쿼리가 하나의 값만 반환한다면, =(Equal) 연산자를 사용할 수도 있다.

잘못된 예제: 단일 값이 아닐 경우 = 사용하면 오류 발생

SELECT film_id, title
FROM film
WHERE film_id = (
    SELECT inventory.film_id
    FROM rental
    INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
    WHERE return_date BETWEEN '2005-05-29' AND '2005-05-30'
);

🔴 오류 발생 가능:

  • 위 쿼리는 서브쿼리가 여러 개의 film_id를 반환할 경우 실행되지 않음

  • = 연산자는 단일 값과만 비교할 수 있기 때문

서브쿼리가 단일 값만 반환하는 경우 = 사용 가능

SELECT film_id, title
FROM film
WHERE film_id = (
    SELECT MAX(inventory.film_id)
    FROM rental
    INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
    WHERE return_date BETWEEN '2005-05-29' AND '2005-05-30'
);

📌 설명:

  • MAX(inventory.film_id)는 하나의 값만 반환하므로 = 사용 가능

3️⃣ EXISTSIN의 차이

또한, EXISTS는 서브쿼리가 행이 존재하는지 여부만 확인하는 연산자로, IN과는 다르게 동작한다.

EXISTS 사용 예제

SELECT film_id, title
FROM film f
WHERE EXISTS (
    SELECT 1
    FROM rental r
    INNER JOIN inventory i ON i.inventory_id = r.inventory_id
    WHERE i.film_id = f.film_id
    AND return_date BETWEEN '2005-05-29' AND '2005-05-30'
);

📌 설명:

  • EXISTS는 서브쿼리에서 film_id가 하나라도 존재하면 TRUE 반환

  • IN과 달리 특정 값을 비교하지 않고 존재 여부만 확인


정리

서브쿼리가 여러 개의 값을 반환하면 IN을 사용해야 한다.
서브쿼리가 하나의 값만 반환하는 경우 =을 사용할 수 있다.
필터링이 아니라 단순히 존재 여부만 확인하고 싶다면 EXISTS를 사용하면 된다.