SQL/프로그래머스

프로그래머스 | SQL 스터디 7

kimmalgu 2024. 9. 3. 19:35

SELECT

과일로 만든 아이스크림 고르기(Lv1)

문제 설명

문제

상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.

풀이

SELECT로 FLAVOR을 선택

JOIN에서 FLAVOR로 두 테이블을 inner join

WHERE문에서 주 성분이 과일이고 총 주문량이 3000보다 크게 설정

ORDER BY에서 총 주문량을 내림차순 정렬

SELECT I.FLAVOR
FROM ICECREAM_INFO I
JOIN FIRST_HALF F ON F.FLAVOR = I.FLAVOR
WHERE INGREDIENT_TYPE = 'fruit_based' 
AND F.TOTAL_ORDER > 3000
ORDER BY F.TOTAL_ORDER DESC

SUM, MAX, MIN

조건에 맞는 아이템들의 가격의 총합 구하기(Lv2)

문제 설명

문제

ITEM_INFO 테이블에서 희귀도가 'LEGEND'인 아이템들의 가격의 총합을 구하는 SQL문을 작성해 주세요. 이때 컬럼명은 'TOTAL_PRICE'로 지정해 주세요.

풀이

SELECT에서 가격의 총합을 TOTAL_PRICE로 설정

WHERE에서 희귀도를 'LEGEND'로 설정

SELECT SUM(PRICE) TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY = 'LEGEND';

GROUP BY

카테고리 별 도서 판매량 집계하기(Lv3)

문제 설명

문제

2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

풀이

SELECT에서 카테고리, 판매량의 합계인 총 판매량을 조회

JOIN에서 BOOK_ID 칼럼을 기준으로 두 테이블을 INNER JOIN

WHERE에서 2022년 1월로 제한

GROUP BY에서 카테고리를 그룹화

ORDER BY에서 카테고리를 기준으로 오름차순 정렬

SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES 
FROM BOOK AS B
INNER JOIN BOOK_SALES AS S ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE '2022-01%'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC;

IS NULL

업그레이드 할 수 없는 아이템 구하기(Lv3)

문제 설명

문제

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

풀이

더 이상 업그레이드 할 수 없는 아이템들은 ITEM_TREE 테이블의 PARENT_ITEM_ID에서 언급되지 않는 아이템들이다!

SELECT에서 ITEM_ID, ITEM_NAME, RARITY를 조회

JOIN에서 ITEM_ID를 기준으로 inner join

WHERE에서 서브쿼리로 PARENT_ITEM_ID를 뽑는데 T.PARENT_ITEM_ID IS NOT NULL을 설정

(NULL인 PARENT_ITEM_ID를 제외하기 위해서임)

해당 서브쿼리에 해당하지 않는 ITEM_ID로 설정!

ORDER BY에서 아이템 ID를 기준으로 내림차순 정렬

SELECT I.ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO I
JOIN ITEM_TREE T ON T.ITEM_ID = I.ITEM_ID
WHERE I.ITEM_ID NOT IN (
SELECT PARENT_ITEM_ID
FROM ITEM_TREE
WHERE PARENT_ITEM_ID IS NOT NULL
)
ORDER BY I.ITEM_ID DESC;

JOIN

있었는데요 없었습니다(Lv3)

문제 설명

문제

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

풀이

SELECT에서 ANIMAL_ID, NAME을 조회

JOIN에서 ANIMAL_ID를 기준으로 두 테이블을 inner join

WHERE에서 보호 시작일보다 입양일이 더 빠르게 설정(→보호 시작일이 입양일보다 크다!)

ORDER BY에서 보호 시작일을 오름차순 정렬(보호 시작일이 빠른순)

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME;

String, Date

대여기록이 존재하는 자동차 리스트 구하기(Lv3)

문제 설명

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.

풀이

SELECT에서 CAR_ID에 DISTINCT로 중복이 없는 자동차ID를 조회

JOIN에서 CAR_ID를 기준으로 두 테이블을 inner join

WHERE에서 자동차 종류가 '세단'이면서 시작날짜가 22년 10월로 제한

ORDER BY에서 자동차 ID를 기준으로 내림차순 정렬

SELECT DISTINCT(C.CAR_ID) CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY R ON C.CAR_ID = R.CAR_ID
WHERE CAR_TYPE = '세단' 
	AND R.START_DATE LIKE '2022-10%'
ORDER BY C.CAR_ID DESC;