6문제
우유와 요거트가 담긴 장바구니
분류, 포인트: IN 절
https://school.programmers.co.kr/learn/courses/30/lessons/62284
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
우선 카테고리가 과자, 국, 김치, 식용유인 항목 중에 가장 비싼 가격을 알아내야겠다고 생각했다.
해당 쿼리는 아래와 같다.
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
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
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
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
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;
'개념 공부 > SQL' 카테고리의 다른 글
[MySQL] SQL 프로그래머스 4단계 다 풀어보기 (2) (2) | 2024.11.10 |
---|---|
[MySQL] WITH, WITH RECURSIVE 구문 (0) | 2024.11.09 |
[MySQL] 코딩테스트 준비를 위한 MySQL 내장함수 정리 (0) | 2024.11.09 |
[SQL / 프로그래머스] JOIN 문제 모음 (2) | 2024.11.07 |
[SQL / 프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 (1) | 2024.10.18 |