[sql] IN, Equal(=), EXISTS
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️⃣ EXISTS
와 IN
의 차이
또한, 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
를 사용하면 된다.