TIL (Today I Learned): 서브쿼리에서 IN 방식과 JOIN 방식 비교
오늘은 SQL 쿼리에서 서브쿼리를 사용하는 두 가지 방식인 IN 방식과 JOIN 방식에 대해 학습했습니다. 이 두 방식은 주로 특정 조건에 따라 데이터를 필터링하거나 매칭할 때 사용되며, 각 방식의 장단점과 활용 사례를 정리했습니다.
예제 문제
문제: REST_INFO 테이블에서 음식 종류별로 즐겨찾기 수(FAVORITES)가 가장 많은 식당의 정보를 가져오기. 결과는 음식 종류(FOOD_TYPE)를 기준으로 내림차순 정렬.
테이블 예시: REST_INFO
REST_ID REST_NAME FOOD_TYPE VIEWS FAVORITES PARKING_LOT ADDRESS TEL
| 00001 | 은돼지식당 | 한식 | 1150345 | 734 | N | 서울 중구 다산로 149 | 010-4484-8751 |
| 00002 | 하이가쯔네 | 일식 | 120034 | 112 | N | 서울 중구 신당동 | NULL |
| 00003 | 따띠따띠뜨 | 양식 | 1234023 | 102 | N | 서울 강남구 신사동 | 02-6397-1023 |
| 00004 | 스시사카우스 | 일식 | 1522074 | 230 | N | 서울 강남구 신사동 | 010-9394-2554 |
| 00005 | 코슌스 | 일식 | 15301 | 123 | N | 서울 강남구 언주로 | 010-1315-8729 |
1. IN 방식
코드:
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
SELECT
FOOD_TYPE,
MAX(FAVORITES) AS MAX_FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;
동작 원리:
- 서브쿼리 실행:
- 각 음식 종류별(FOOD_TYPE)로 즐겨찾기 수(FAVORITES)의 최댓값(MAX(FAVORITES))을 계산.
- 결과 예시:FOOD_TYPE MAX_FAVORITES
한식 734 일식 230 양식 102
- 메인 쿼리에서 필터링:
- IN 조건을 사용하여 서브쿼리에서 반환된 (FOOD_TYPE, MAX_FAVORITES)에 해당하는 데이터를 필터링.
2. JOIN 방식
코드:
SELECT
R1.FOOD_TYPE,
R1.REST_ID,
R1.REST_NAME,
R1.FAVORITES
FROM
REST_INFO R1
JOIN
(SELECT
FOOD_TYPE,
MAX(FAVORITES) AS FAVORITES
FROM
REST_INFO
GROUP BY
FOOD_TYPE) R2
ON
R1.FOOD_TYPE = R2.FOOD_TYPE
AND R1.FAVORITES = R2.FAVORITES
ORDER BY R1.FOOD_TYPE DESC;
동작 원리:
- 서브쿼리 실행:
- 각 음식 종류별(FOOD_TYPE)로 즐겨찾기 수(FAVORITES)의 최댓값(MAX(FAVORITES))을 계산.
- 결과는 위와 동일.
- JOIN으로 데이터 매칭:
- 서브쿼리 결과(R2)와 원본 테이블(R1)을 FOOD_TYPE과 FAVORITES 기준으로 조인.
- 최댓값에 해당하는 데이터만 선택.
비교: IN vs JOIN
항목 IN 방식 JOIN 방식
| 가독성 | 간결하고 직관적. 유지보수가 용이. | 약간 더 복잡하지만 논리적인 흐름이 명확. |
| 성능 (소규모 데이터) | 서브쿼리가 적은 양의 데이터에서 빠르게 동작. | 데이터가 작을 경우 JOIN과 성능 차이가 거의 없음. |
| 성능 (대규모 데이터) | 서브쿼리 반복 실행으로 성능 저하 가능. | 대규모 데이터에서 더 효율적. 최적화 엔진이 인덱스를 활용 가능. |
| 유연성 | 간단한 필터링이나 특정 값 비교에 적합. | 복잡한 조건, 다중 테이블 조인 등이 필요한 경우 더 유리. |
| 추가 조건 확장 | 서브쿼리를 수정해야 하므로 구조가 덜 유연. | 조인 구조에서 조건 확장이 쉬움. |
결론: 어떤 방식을 선택할까?
- 소규모 데이터: IN 방식
- 쿼리가 간단하고 가독성이 좋기 때문에 적은 데이터에서 효율적으로 동작.
- 대규모 데이터: JOIN 방식
- 데이터가 크거나 인덱스를 활용해야 할 경우, JOIN 방식이 성능적으로 더 적합.
개인적인 의견:
작성된 두 방식 모두 훌륭하지만, 데이터 규모가 클수록 JOIN 방식이 더 선호됩니다.
SQL 실무에서는 유지보수와 성능을 고려하여 상황에 맞는 방식을 선택하는 것이 중요합니다.
'Sql' 카테고리의 다른 글
| [SQL퀘스트] 1) 돈을 벌기 위해 일을 합시다! (1) | 2024.11.05 |
|---|