SQL - IN vs EXISTS: 초보자를 위한 종합 가이드

안녕하세요, 미래의 SQL 마법사 여러분! SQL의 세계로 인도해드리게 되어 매우 기쁩니다. 오늘 우리는 SQL 도구 상자에 있는 두 가지 강력한 도구를 탐구할 것입니다: IN과 EXISTS 연산자. 프로그래밍에 처음이라면 걱정 마세요 - 나는 단계별로 안내해드릴 것입니다. 여러 해 동안 수업에서 수많은 학생들에게 했던 것처럼 말입니다.

SQL - IN vs EXISTS

SQL IN 연산자

먼저 IN 연산자부터 시작해보겠습니다. 파티를 계획하고 친구들 목록을 초대할 때를 상상해보세요. IN 연산자는 비슷하게 작동합니다 - WHERE 절에서 여러 값을 지정할 수 있게 해줍니다. "이 값들 중 하나에 매칭되는 모든 데이터를 찾고 싶다"고 말하는 것과 같습니다.

기본 문법

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

예제 1: 특정 과일 찾기

'fruits'라는 테이블이 있어서 'id'와 'name' 열이 있습니다. 사과, 바나나, 오렌지 중 하나인 과일을 찾고 싶습니다.

SELECT * FROM fruits
WHERE name IN ('apple', 'banana', 'orange');

이 쿼리는 과일 이름이 사과, 바나나, 오렌지 중 하나인 모든 행을 반환합니다. "이 목록에 있는 모든 과일을 줄 수 있나요?"라고 묻는 것과 같습니다.

예제 2: IN과 서브쿼리 사용

IN 연산자는 서브쿼리와 함께 사용될 때 더욱 강력해집니다. 'favorite_fruits'라는 테이블이 있어서 사람들의 좋아하는 과일을 나열하고 있습니다.

SELECT * FROM fruits
WHERE name IN (SELECT fruit_name FROM favorite_fruits);

이 쿼리는 누군가의 좋아하는 과일인 모든 과일을 찾습니다. "누군가의 좋아하는 목록에 있는 모든 과일을 보여줘."라고 말하는 것과 같습니다.

SQL EXISTS 연산자

이제 EXISTS 연산자로 넘어가보겠습니다. IN은 목록에서 항목을 체크하는 것처럼 보이지만, EXISTS는 yes/no 질문을 하는 것 같습니다. 특정 조건을 만족하는 행이 있는지 확인합니다.

기본 문법

SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);

예제 3: 주문된 과일 찾기

'orders' 테이블이 있어서 과일 주문을 기록하고 있습니다. 적어도 한 번 주문된 과일을 찾고 싶습니다.

SELECT * FROM fruits
WHERE EXISTS (
SELECT 1 FROM orders
WHERE orders.fruit_id = fruits.id
);

이 쿼리는 적어도 한 번 주문된 모든 과일을 반환합니다. "이 과일에 주문이 있는가? 만약 있다면 과일을 보여줘."라고 묻는 것과 같습니다.

예제 4: 주문하지 않은 고객 찾기

NOT EXISTS를 사용하여 반대의 경우를 찾을 수도 있습니다. 주문하지 않은 고객을 찾아보겠습니다.

SELECT * FROM customers
WHERE NOT EXISTS (
SELECT 1 FROM orders
WHERE orders.customer_id = customers.id
);

이 쿼리는 주문이 없는 모든 고객을 찾습니다. "주문하지 않은 고객이 있는가? 그 고객을 보여줘."라고 묻는 것과 같습니다.

IN vs EXISTS: 어떤 것을 사용할까?

IN과 EXISTS를 사용해보았으니, "각각을 언제 사용해야 할까요?"라는 의문이 드실 수 있습니다. 훌륭한 질문입니다! 함께 알아보겠습니다.

성능 고려 사항

일반적으로:

  • 서브쿼리 결과가 작을 때 IN이 더 빠릅니다
  • 큰 데이터셋에서는 EXISTS가 더 효율적일 수 있습니다

하지만 데이터베이스 성능은 다를 수 있으므로, 특정 데이터로 테스트하는 것이 좋습니다.

가독성과 의도

  • 특정 값 목록을 확인할 때 IN을 사용합니다
  • 관련 데이터의 존재 여부를 확인할 때 EXISTS를 사용합니다

NULL 처리

  • IN은 NULL 값을 다르게 처리합니다 (NULL 행을 반환하지 않습니다)
  • EXISTS는 이 제약이 없습니다

다음 표는 각각을 사용할 때를 요약합니다:

시나리오 권장 연산자
작은 목록을 확인할 때 IN
관련 레코드의 존재 여부를 확인할 때 EXISTS
큰 데이터셋에서 작업할 때 EXISTS
NULL 값을 포함해야 할 때 EXISTS
여러 조건을 확인할 때 EXISTS

결론

그렇습니다, 제 SQL 제자 여러분! IN과 EXISTS의 땅을 거쳐 여정을 마쳤습니다. 그들의 강점과 사용 사례를 탐구해보았습니다. 기억하세요, IN과 EXISTS 중 어느 것을 선택하는 것은 특정 상황에 따라 다릅니다.

SQL 모험을 계속하면서 두 연산자를 실험해보세요. 데이터로 테스트해보고, 언제 어느 것을 사용해야 하는 직관을 키워보세요.

마지막으로 SQL 유머 한 가지를 드릴게요: 데이터베이스 관리자가 왜 그의 아내를 떠났을까요? 그녀는 너무 많은 뷰를 가지고 있었고, 그는 그녀의 헌신 부족을 감당할 수 없었기 때문입니다!

계속 연습하고, 호기심을 가지고, 행복하게 쿼리 작성하세요!

Credits: Image by storyset