본문 바로가기
개념 공부/SQL

[MySQL] 프로그래머스 SQL 4단계 모두 풀어보기! (1)

by clean01 2024. 11. 9.

6문제

 

우유와 요거트가 담긴 장바구니

분류, 포인트: IN 절

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT DISTINCT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN ( -- 우유
    SELECT CP1.CART_ID FROM CART_PRODUCTS AS CP1 WHERE CP1.NAME = 'Milk'
)
AND CART_ID IN ( -- 요거트
    SELECT CP1.CART_ID FROM CART_PRODUCTS AS CP1 WHERE CP1.NAME = 'Yogurt'
)
ORDER BY CART_ID;

 

 


 

식품 분류 별 가장 비싼 식품의 정보 조회하기

분류, 포인트: 서브 쿼리, INNER JOIN

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

우선 카테고리가 과자, 국, 김치, 식용유인 항목 중에 가장 비싼 가격을 알아내야겠다고 생각했다.

해당 쿼리는 아래와 같다.

    SELECT FP.CATEGORY AS CATEGORY, MAX(FP.PRICE) AS MAX_PRICE
    FROM FOOD_PRODUCT AS FP
    WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
    GROUP BY FP.CATEGORY

 

그리고 이 쿼리를 서브쿼리로 해서 이너조인을 걸어줘야겠다고 생각했다.

일단 카테고리를 기준으로 조인을 걸어주었고, 그 중 서브 쿼리의 최대 가격과 전체 테이블의 가격이 같은 것이 카테고리 중에 가장 비싼 상품이 된다.

SELECT FOOD_PRODUCT.CATEGORY AS CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
INNER JOIN (
    SELECT FP.CATEGORY AS CATEGORY, MAX(FP.PRICE) AS MAX_PRICE
    FROM FOOD_PRODUCT AS FP
    WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
    GROUP BY FP.CATEGORY
) AS MPT ON MPT.CATEGORY = FOOD_PRODUCT.CATEGORY
WHERE MPT.MAX_PRICE = FOOD_PRODUCT.PRICE
ORDER BY MAX_PRICE DESC;

 

 


 

서울에 위치한 식당 목록 출력하기

분류, 포인트: 반올림, ROUND(숫자, 나타낼 소수점 개수)

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT RI.REST_ID AS REST_ID, RI.REST_NAME AS REST_NAME, RI.FOOD_TYPE AS FOOD_TYPE, RI.FAVORITES AS FAVORITES, RI.ADDRESS AS ADDRESS, ROUND(AVG(RR.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO AS RI
JOIN REST_REVIEW AS RR ON RR.REST_ID = RI.REST_ID
WHERE ADDRESS LIKE '서울%' -- 서울시, 서울특별시
GROUP BY RI.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;

 

 

 


년, 월, 성별 별 상품 구매 회원 수 구하기

포인트: 집계함수 안에 DISTINCT 키워드( 한 유저가 여러번 샀어도, 유저의 수이기 때문에 한번만 집계해야 함)

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, UI.GENDER AS GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS
FROM USER_INFO AS UI
JOIN ONLINE_SALE AS OS ON OS.USER_ID = UI.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER;

 


취소되지 않은 진료 예약 조회하기

포인트: DATE() 내장함수(DATETIME 컬럼에서 날짜만 빼서 비교하기), 두번 조인(=테이블 3개 조인)

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT A.APNT_NO AS APNT_NO, P.PT_NAME AS PT_NAME, P.PT_NO AS PT_NO, A.MCDP_CD AS MCDP_CD, D.DR_NAME AS DR_NAME, A.APNT_YMD AS APNT_YMD
FROM APPOINTMENT AS A
JOIN DOCTOR AS D ON D.DR_ID = A.MDDR_ID
JOIN PATIENT AS P ON P.PT_NO = A.PT_NO
WHERE A.APNT_CNCL_YMD IS NULL
AND A.MCDP_CD = 'CS'
AND DATE(APNT_YMD) = '2022-04-13'
ORDER BY A.APNT_YMD;

 


저자 별 카테고리 별 매출액 집계하기

포인트: 서브쿼리 또는 WITH 구문을 통해 임시 테이블 만들어 조인하기

카테고리 별로 쿼리 결과를 보여주어야 하지만, 가격과 수량을 곱할 때 가격,수량은 BOOK_ID 별로 GROUP BY 되어야하기 때문에 임시 테이블이 필요하다.

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

WITH SALES_DATA AS (
    SELECT B.BOOK_ID AS BOOK_ID, SUM(B.PRICE * BS.SALES) AS TOTAL_PRICE
    FROM BOOK AS B
    JOIN BOOK_SALES AS BS ON B.BOOK_ID = BS.BOOK_ID
    WHERE SALES_DATE >= '2022-01-01' AND SALES_DATE <= '2022-01-31'
    GROUP BY B.BOOK_ID
)
SELECT A.AUTHOR_ID AS AUTHOR_ID, A.AUTHOR_NAME AS AUTHOR_NAME, B.CATEGORY AS CATEGORY, SUM(S.TOTAL_PRICE) AS TOTAL_SALES
FROM BOOK AS B
JOIN AUTHOR AS A ON A.AUTHOR_ID = B.AUTHOR_ID
JOIN SALES_DATA S ON S.BOOK_ID = B.BOOK_ID
GROUP BY B.CATEGORY, A.AUTHOR_ID
ORDER BY AUTHOR_ID, CATEGORY DESC;