프로그래머스 LV 4. 133027 주문량이 많은 아이스크림들 조회하기 MySQL

https://school.programmers.co.kr/learn/courses/30/lessons/133027

 

SELECT FLAVOR
FROM (
    SELECT FLAVOR, SUM(TOTAL_ORDER) AS total_orders
    FROM (
        SELECT FLAVOR, TOTAL_ORDER
        FROM FIRST_HALF
        UNION ALL
        SELECT FLAVOR, TOTAL_ORDER
        FROM JULY
    ) AS combined_orders
    GROUP BY FLAVOR
) AS combined_flavors
ORDER BY total_orders DESC
LIMIT 3;

 

위의 형태로 작성할때 주의해야 할 부분은, UNION ALL의 경우는중복을 포함해 주는데, UNION 의 경우는 중복을 제거한다는 것이다. 그냥 UNION을 사용해버리면 결과가 전혀 다르게 되어버릴 수 있다(중복된 요소가 있는 경우)

그렇기 때문에 UNION을 사용할때 UNION 을 사용해서 중복을 제거해버릴지, 혹은 UNION ALL 을 사용해서 중복을 포함해서 합칠지 잘 생각하고 고려해서 실행해야한다. 

 

GROUP BY 를 사용할때도 주의해야 할 부분이, 중복되는 이름이 있는데 GROUP BY를 하면, 해당 이름에 해당하는 값들중에서 어떤 값이 될지에 대해서 생각해보아야 한다. 그냥 GROUP BY를 해버리면 예를들어 두가지주 중에 어떤 값이될지를 모른다. 어떤 데이터베이스를 쓰는지에 다라서 다를것이고, 구현을 어떻게 해놨을지에 따라 다를것이다. 

그래서 그런식으로 GROUP BY가 되어있을때 다른 값들에 대해서 어떤식으로 처리해줄지에 대해서 잘 생각해고, 

이 경우 SUM(TOTAL_ORDER) 를 해준 값으로 GROUP BY 를 해서 나온 하나의 FLAVOR에 그 값이 연간되게 된다. 

 

JOIN 을 사용한 형태의 쿼리문으로 위의 요구사항을 해결하면, 

SELECT F.FLAVOR
FROM FIRST_HALF AS F
JOIN JULY AS J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY (SUM(J.TOTAL_ORDER) + SUM(F.TOTAL_ORDER)) DESC
LIMIT 3;

이와 같은데, 이런식으로 작성하는것이 더 간결해보이고 이해하기 쉬울것 같다. 

 

이때에 GROUP BY F.FLAVOR 을 수행하나, GROUP BY J.FLAVOR을 수행하나 결과는 같다. 

이에 대해 참고할만한 지피티 검색결과를 첨부한다. 

JOIN을 사용하면 두 테이블 간의 연결을 통해 새로운 결과 테이블이 생성됩니다. JOIN 시에는 두 테이블 간의 연결 조건을 만족하는 행만 선택되어 결과에 포함됩니다.

위의 쿼리에서는 F.FLAVOR = J.FLAVOR 조건으로 FIRST_HALF 테이블의 FLAVOR와 JULY 테이블의 FLAVOR를 기준으로 두 테이블을 조인하고 있습니다. 이것은 F.FLAVOR와 J.FLAVOR가 동일한 값을 가지는 행들만을 결과에 포함시킨다는 의미입니다.

따라서 JOIN 이후에는 F.FLAVOR와 J.FLAVOR는 동일한 값을 가지게 됩니다. 어떤 테이블의 FLAVOR를 사용하더라도 결과는 같습니다. 그래서 GROUP BY J.FLAVOR 또는 GROUP BY F.FLAVOR를 사용하더라도 결과는 동일할 것입니다.

 

혹은 아래와 같이 작성해도 동일한 기능을 한다. 

SELECT J.FLAVOR
FROM JULY AS J
JOIN FIRST_HALF AS F
ON J.FLAVOR = F.FLAVOR
GROUP BY J.FLAVOR
ORDER BY (SUM(J.TOTAL_ORDER)+SUM(F.TOTAL_ORDER)) DESC
LIMIT 3;

 

  Comments,     Trackbacks