DB 데이터/실무 중심 쿼리 활용법

서브쿼리 vs JOIN 언제 어떻게 쓰나

backend.log 2025. 5. 7. 18:00
728x90
반응형

📘 2-2. 서브쿼리 vs JOIN 언제 어떻게 쓰나

MySQL에서 같은 데이터를 가져오더라도 서브쿼리JOIN 중 어떤 방식을 선택하느냐에 따라 성능과 가독성이 달라질 수 있습니다.
이번 포스팅에서는 실무 상황에서 서브쿼리와 JOIN을 언제, 어떻게 써야 하는지 비교합니다.

📌 기본 개념 요약

  • 서브쿼리 (Subquery): 쿼리 안에 또 다른 SELECT 쿼리를 사용하는 방식
  • JOIN: 여러 테이블을 키를 기준으로 연결하여 한 번에 데이터를 가져오는 방식

✅ 예제 1: 사용자별 총 주문 금액 구하기

🔹 서브쿼리 방식

SELECT 
  u.id,
  u.name,
  (SELECT SUM(o.price) FROM orders o WHERE o.user_id = u.id) AS total_spent
FROM users u;

🔹 JOIN 방식

SELECT 
  u.id,
  u.name,
  SUM(o.price) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;

📌 차이점:
- 소량 데이터에서는 성능 차이 미미
- JOIN은 GROUP BY를 요구하지만 서브쿼리는 간단한 형태로 표현 가능
- JOIN은 중복데이터가 생길 가능성이 있어, SUM 등 집계 시 주의 필요

✅ 예제 2: 최근 주문 날짜가 있는 사용자만 조회

🔹 서브쿼리 방식

SELECT *
FROM users
WHERE id IN (
  SELECT DISTINCT user_id
  FROM orders
  WHERE created_at >= CURDATE() - INTERVAL 30 DAY
);

🔹 JOIN 방식

SELECT DISTINCT u.*
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.created_at >= CURDATE() - INTERVAL 30 DAY;

📌 차이점:
- JOIN은 데이터를 더 많이 가져오기 때문에 SELECT 절에 꼭 필요한 필드만 명시하는 게 좋음
- 서브쿼리는 직관적이지만, IN절이 느릴 수 있어 EXISTS로 변경하면 성능 개선 가능

💡 실무 팁: 선택 기준

  • JOIN 추천: 데이터를 하나의 테이블처럼 보고, 한 번에 집계할 때
  • 서브쿼리 추천: 특정 조건을 만족하는 필터링, 랭킹, 조건부 조인 등 개별 계산이 필요할 때
  • 대량 데이터: JOIN 시 반드시 인덱스 확인 & 중복 제거 주의

📚 다음 글 예고

다음 포스팅에서는 2-3. GROUP BY와 CASE WHEN을 활용한 조건부 집계 편으로 넘어갑니다.
👉 다양한 조건을 한 번에 통계로 집계하는 실전 쿼리를 다룹니다.

728x90
반응형