다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블과 아이스크림 성분에 대한 정보를 담은 ICECREAM_INFO 테이블입니다.
FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다.
NAME
TYPE
NULLABLE
SHIPMENT_ID
INT(N)
FALSE
FLAVOR
VARCHAR(N)
FALSE
TOTAL_ORDER
INT(N)
FALSE
ICECREAM_INFO 테이블 구조는 다음과 같으며, FLAVOR, INGREDITENT_TYPE 은 각각 아이스크림 맛, 아이스크림 성분 타입을 나타냅니다.
INGREDIENT_TYPE에는 아이스크림의 주 성분이 설탕이면 sugar_based라고 입력되고, 아이스크림의 주 성분이 과일이면 fruit_based라고 입력됩니다. ICECREAM_INFO의 기본 키는 FLAVOR입니다. ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.
NAME
TYPE
NULLABLE
FLAVOR
VARCHAR(N)
FALSE
INGREDIENT_TYPE
VARCHAR(N)
FALSE
문제 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요.
이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.
2) 예시
예를 들어 FIRST_HALF 테이블이 다음과 같다면
SHIPMENT_ID
FLAVOR
TOTAL_ORDER
101
chocolate
3200
102
vanilla
2800
103
mint_chocolate
1700
104
caramel
2600
105
white_chocolate
3100
106
peach
2450
107
watermelon
2150
108
mango
2900
109
strawberry
3100
110
melon
3150
111
orange
2900
112
pineapple
2900
ICECREAM_INFO 테이블이 다음과 같다면
FLAVOR
INGREDIENT_TYPE
chocolate
sugar_based
vanilla
sugar_based
mint_chocolate
sugar_based
caramel
sugar_based
white_chocolate
sugar_based
peach
fruit_based
watermelon
fruit_based
mango
fruit_based
strawberry
fruit_based
melon
fruit_based
orange
fruit_based
pineapple
fruit_based
상반기에 아이스크림의 주 성분이 설탕인 아이스크림들에 대한 총주문량을 구하면 3,200 + 2,800 + 1,700 + 2,600 + 3,100 = 13,400입니다.
아이스크림의 주 성분이 과일인 아이스크림들에 대한 총주문량을 구하면 3,100 + 2,450 + 2,150 + 2,900 + 3,150 + 2,900 + 2,900 = 19,550입니다. 따라서 총주문량이 작은 순서대로 조회하는 SQL 문을 실행하면 다음과 같이 나와야 합니다.
INGREDIENT_TYPE
TOTAL_ORDER
sugar_based
13400
fruit_based
19550
3) 풀이
1. ICECREAM_INFO 테이블을 I, FIRST_HALF 테이블을 F로 지정합니다.
테이블에서 재료 타입, 해당 아이스크림의 주문량을 모두 더한 값(GROUB BY에 의해 같은 재료 타입인 것을 SUM해줌)을
구하고 'TOTAL_ORDER'열로 만들어줍니다.
● SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS `TOTAL_ORDER` FROM FIRST_HALF AS F
● INNER JOIN ICECREAM_INFO AS I ON I.FLAVOR = F.FLAVOR
※ JOIN
테이블 간의 연결 작업을 수행하는데 사용되는 키워드
JOIN 유형
설명
JOIN 조건
INNER JOIN
두 테이블 사이에서 일치하는 행만 반환합니다.
조건을 ON 절에 지정
LEFT JOIN (LEFT OUTER JOIN)
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 반환합니다.
조건을 ON 절에 지정
RIGHT JOIN (RIGHT OUTER JOIN)
오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 반환합니다.
조건을 ON 절에 지정
FULL OUTER JOIN
양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL 값으로 채워집니다.
조건을 ON 절에 지정
CROSS JOIN
두 테이블의 모든 행을 조합하여 반환합니다.
조건이 필요 없음
NATURAL JOIN
두 테이블 사이에서 칼럼 이름이 동일한 칼럼들을 기반으로 일치하는 행을 반환합니다.
조건이 필요 없음
SELF JOIN
하나의 테이블을 여러 번 사용하여 자체와 조인하는 것을 의미합니다.
별명으로 조인
USING 절
두 테이블 사이에서 일치하는 칼럼들을 지정하여 사용합니다.
조건을 USING 절에 지정
3. 재료 타입으로 그룹화해줍니다. 결과값은 재료 타입별로 나오게 됩니다.
● GROUP BY I.INGREDIENT_TYPE
4. 총주문량이 작은 것부터 나열되게 합니다. (오름차순으로 해주면 됩니다.)
● ORDER BY `TOTAL_ORDER` ASC;
4) 코드
SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS `TOTAL_ORDER` FROM FIRST_HALF AS F
INNER JOIN ICECREAM_INFO AS I ON I.FLAVOR = F.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY `TOTAL_ORDER` ASC;