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
반응형
'DB 데이터 > 실무 중심 쿼리 활용법' 카테고리의 다른 글
RANK, ROW_NUMBER를 활용한 순위 처리 (1) | 2025.05.10 |
---|---|
조건 만족 누적합 (Cumulative SUM) (0) | 2025.05.09 |
GROUP BY와 CASE WHEN을 활용한 조건부 집계 (0) | 2025.05.08 |
조건부 COUNT와 SUM 쓰는 법 (1) | 2025.04.24 |