본문 바로가기
Sql

[TIL] 241209 서브쿼리 방식 비교

by 좌우지간에 2024. 12. 9.

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;

동작 원리:

  1. 서브쿼리 실행:
    • 각 음식 종류별(FOOD_TYPE)로 즐겨찾기 수(FAVORITES)의 최댓값(MAX(FAVORITES))을 계산.
    • 결과 예시:FOOD_TYPE MAX_FAVORITES
      한식 734
      일식 230
      양식 102
  2. 메인 쿼리에서 필터링:
    • 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;

동작 원리:

  1. 서브쿼리 실행:
    • 각 음식 종류별(FOOD_TYPE)로 즐겨찾기 수(FAVORITES)의 최댓값(MAX(FAVORITES))을 계산.
    • 결과는 위와 동일.
  2. JOIN으로 데이터 매칭:
    • 서브쿼리 결과(R2)와 원본 테이블(R1)을 FOOD_TYPE과 FAVORITES 기준으로 조인.
    • 최댓값에 해당하는 데이터만 선택.

비교: IN vs JOIN

항목 IN 방식 JOIN 방식

가독성 간결하고 직관적. 유지보수가 용이. 약간 더 복잡하지만 논리적인 흐름이 명확.
성능 (소규모 데이터) 서브쿼리가 적은 양의 데이터에서 빠르게 동작. 데이터가 작을 경우 JOIN과 성능 차이가 거의 없음.
성능 (대규모 데이터) 서브쿼리 반복 실행으로 성능 저하 가능. 대규모 데이터에서 더 효율적. 최적화 엔진이 인덱스를 활용 가능.
유연성 간단한 필터링이나 특정 값 비교에 적합. 복잡한 조건, 다중 테이블 조인 등이 필요한 경우 더 유리.
추가 조건 확장 서브쿼리를 수정해야 하므로 구조가 덜 유연. 조인 구조에서 조건 확장이 쉬움.

결론: 어떤 방식을 선택할까?

  • 소규모 데이터: IN 방식
    • 쿼리가 간단하고 가독성이 좋기 때문에 적은 데이터에서 효율적으로 동작.
  • 대규모 데이터: JOIN 방식
    • 데이터가 크거나 인덱스를 활용해야 할 경우, JOIN 방식이 성능적으로 더 적합.

개인적인 의견:

작성된 두 방식 모두 훌륭하지만, 데이터 규모가 클수록 JOIN 방식이 더 선호됩니다.
SQL 실무에서는 유지보수와 성능을 고려하여 상황에 맞는 방식을 선택하는 것이 중요합니다. 

'Sql' 카테고리의 다른 글

[SQL퀘스트] 1) 돈을 벌기 위해 일을 합시다!  (1) 2024.11.05