LV.1 과일로 만든 아이스크림 고르기
문제
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의
주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.
해설
추출해야할 것 flavor
조건 total_order > 3000, ingredient_type = "fruit_based"
정렬 total_order DESC
1. ingredient_type과 total_order의 조건식을 적기 위해서 JOIN한다<서브쿼리도 가능>
2. 조건식을 적어주고 정렬한다
이를 구현한 코드는 아래와 같다
SELECT F.flavor FROM First_half AS F
LEFT OUTER JOIN Icecream_info AS I ON F.flavor = I.flavor
WHERE total_order > 3000 AND ingredient_type LIKE "%fruit%"
ORDER BY total_order DESC
-- 서브쿼리로 푼 문제
SELECT flavor FROM First_half
WHERE flavor IN (SELECT flavor FROM Icecream_info
WHERE ingredient_type LIKE "fruit%")
AND total_order > 3000
ORDER BY total_order DESC
LV.2 성분으로 구분한 아이스크림 총 주문량
문제
상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.
해설
추출해야할 것 ingredient_type, SUM<total_order>
조건 ingredient_type을 기준으로 그룹
정렬 total_order ASC
1. First_half와 Icecream_info 테이블을 JOIN한다
2. ingredient_type으로 GROUP BY 한다
3. 정렬한다
SELECT ingredient_type, SUM(total_order) AS TOTAL_ORDER FROM First_half AS F
JOIN Icecream_info AS I ON F.flavor = I.flavor
GROUP BY ingredient_type
ORDER BY TOTAL_ORDER ASC
LV.4 주문량이 많은 아이스크림들 조회하기
문제
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이
큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
해설
추출해야할 것 flavor
조건 상반기 + 7월의 주문량
정렬 total_order DESC LIMIT 3
1. 지문의 마지막 줄에 주의해보자
"같은 맛의 아이스크림이라도 다른 출하 번호를 같게된다"
이는 shipment_id로만 GROUP BY 한다면 누락된 주문건이 생길 수 있음을 의미한다
2. 필드의 구성이 모두 같아 UNION ALL을 써서 두 테이블을 행방향으로 합친다
3. flavor를 기준으로 GROUP BY한다
4. 총 주문량을 기준으로 내림차순하고 LIMIT 3를 걸어준다
-- UNION ALL을 쓴 버전
SELECT flavor FROM (
SELECT * FROM First_half
UNION ALL
SELECT * FROM July) AS A
GROUP BY flavor
ORDER BY SUM(total_order) DESC
LIMIT 3
-- 인라인뷰를 쓴 버전
SELECT j.flavor
FROM (SELECT flavor, SUM(total_order) AS j_order FROM July GROUP BY flavor) AS J
INNER JOIN (SELECT flavor, SUM(total_order) AS f_order FROM First_half GROUP BY flavor) AS F
ON J.flavor = F.flavor
ORDER BY j_order + f_order DESC LIMIT 3
* 어떤 버전이든 메모리를 줄이고 속도를 높이는 쿼리가 상황마다 다를 것이다
UNION ALL은 직관적이면서도 간단하다.
하지만 계속해서 메모리에 올려놓는 Temporary Table이기 때문에 그리 효율적이진 못하다.
또한 애초에 UNION ALL로 묶을 수 있는 같은 엔터티였다면
같은 테이블에 묶일 수 있도록 설계해야 한다
<상반기와 7월을 굳이 떼어놓을 필요가 없듯이>
인라인뷰 버전은 집계를 마친 가상의 두 테이블에서 결과를 내기 위해 만들었다
대부분의 사람들이 모두 UNION을 쓰길래 이렇게도 할 수 있다는 것을 보여준다
'Development > SQL' 카테고리의 다른 글
[프로그래머스 스쿨 - MYSQL] 자동차 대여 문제 Lv.1 ~Lv.4 (2) | 2023.10.26 |
---|---|
[프로그래머스 스쿨 - MYSQL] 이커머스 문제 Lv.2 ~Lv.5 (0) | 2023.10.03 |
[프로그래머스 스쿨 - MYSQL] 도서 문제 Lv.1 ~Lv.4 (0) | 2023.09.30 |
[프로그래머스 스쿨 - MYSQL] 자동차 문제 Lv.1 ~Lv.3 (0) | 2023.09.28 |
[프로그래머스 스쿨 - MYSQL] 중고거래 문제 Lv.1 ~Lv.3 (0) | 2023.09.27 |