[MySQL] 서브쿼리 중첩

lazy_h·2026년 1월 12일

MySQL 다루기

목록 보기
15/18
post-thumbnail

(※개인 공부 목적의 게시물입니다.)


프로그래머스 > sql > join > 주문량이 많은 아이스크림들 조회하기

문제 바로가기


<문제설명>

다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블7월의 아이스크림 주문 정보를 담은 JULY 테이블입니다.

FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다.

FIRST_HALF 테이블의 기본 키는 FLAVOR입니다. FIRST_HALF테이블의 SHIPMENT_IDJULY테이블의 SHIPMENT_ID의 외래 키입니다.

NAMETYPENULLABLE
SHIPMENT_IDINT(N)FALSE
FLAVORVARCHAR(N)FALSE
TOTAL_ORDERINT(N)FALSE

JULY 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 은 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 7월 아이스크림 총주문량을 나타냅니다.

JULY 테이블의 기본 키는 SHIPMENT_ID입니다. JULY테이블의 FLAVORFIRST_HALF 테이블의 FLAVOR의 외래 키입니다.

7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.

NAMETYPENULLABLE
SHIPMENT_IDINT(N)FALSE
FLAVORVARCHAR(N)FALSE
TOTAL_ORDERINT(N)FALSE

<문제>

7월 아이스크림 총 주문량상반기의 아이스크림 총 주문량더한 값큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.


<풀이코드>

SELECT FLAVOR
FROM 
	(SELECT SUM(A.TOTAL_ORDER) AS TOTAL,
    		A.FLAVOR
     FROM 
     	(SELECT *
         FROM FIRST_HALF
         UNION ALL
         SELECT *
         FROM JULY) A
     GROUP BY A.FLAVOR) B
     
ORDER BY TOTAL DESC
LIMIT 3;

<풀이순서>

  1. 두 테이블 UNION ALL
  2. FLAVOR별로 그룹화
  3. 그룹별 TOTAL_ORDERS를 SUM 집계
  4. SUM 집계결과를 내림차순 하기
  5. 정렬된 상태로 상위 3개 뽑기

<설명>

  • FROM 
         (SELECT *
             FROM FIRST_HALF
          UNION ALL
          SELECT *
             FROM JULY) A
    • FIRST_HALF 테이블과 JULY 테이블의 컬럼이 모두 같으므로 UNION ALL로 합칠 수 있음(수직으로 합쳐짐)

    • 합친 테이블 A의 TOTAL_ORDERS의 값들의 총합을 구하면
      [7월 아이스크림 총 주문량 + 상반기의 아이스크림 총 주문량] 을 구할 수 있음

  • FROM 
    	(SELECT SUM(A.TOTAL_ORDER) AS TOTAL,
        		A.FLAVOR
         FROM 
         	(SELECT *
               FROM FIRST_HALF
              UNION ALL
              SELECT *
               FROM JULY) A
         GROUP BY A.FLAVOR) B
    • GROUP BY A.FLAVOR : 아이스크림의 FLAVOR을 기준으로 그룹화

    • SUM(A.TOTAL_ORDER) AS TOTAL : 두 테이블을 합친 테이블 A의 FLAVOR 별 TOTAL_ORDERS(총 주문량)의 합을 구함, 별칭 TOTAL을 작성해줌

    • 최종 SELECT절에서 FLAVOR을 조회해야하므로 A.FLAVOR도 서브쿼리에 포함시킴

    • [7월 아이스크림 총 주문량 + 상반기의 아이스크림 총 주문량] 과 맛을 포함하는 테이블 B가 만들어짐

    • 중첩 서브쿼리 : FROM 서브쿼리 A -> FROM 서브쿼리 B

  • ORDER BY TOTAL DESC
    • 서브쿼리에서 지어줬던 별칭을 이용해서 정렬가능

    • SUM(A.TOTAL_ORDER) AS TOTAL 이 큰 순서대로 정렬해야하므로 내림차순(DESC)

  • LIMIT 3
    • 내림차순 정렬상태에서 상위 3개의 맛을 출력해야하므로, LIMIT으로 출력 개수 제한

profile
fun coding

0개의 댓글