오늘은 SQL 문제 풀이를 통해 다양한 실전 개념을 익혔다.
내가 직접 작성한 SQL 쿼리를 중심으로 정리하고, 쿼리별 설명을 추가하였다.
PRODUCT
테이블에서 만원 단위 가격대별 상품 개수를 구하는 문제.SELECT CASE
WHEN PRICE < 10000 THEN '0'
WHEN PRICE < 20000 THEN '10000'
WHEN PRICE < 30000 THEN '20000'
WHEN PRICE < 40000 THEN '30000'
ELSE '40000'
END PRICE_GROUP,
COUNT(PRICE) PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1;
CASE WHEN
을 사용하여 만원 단위 가격대 그룹화.COUNT(PRICE)
를 사용하여 각 가격대별 상품 개수 계산.GROUP BY 1
을 사용하여 가격 그룹별로 집계.ORDER BY 1
을 사용해 가격 그룹 오름차순 정렬.MEMBER_PROFILE
테이블에서 생일이 3월인 여성 회원을 조회하는 문제.MEMBER_ID
오름차순 정렬.SELECT MEMBER_ID,MEMBER_NAME,GENDER,DATE_FORMAT(DATE_OF_BIRTH,'%Y-%m-%d') DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_FORMAT(DATE_OF_BIRTH,'%m') = 03
AND GENDER = 'W'
AND TLNO IS NOT NULL
ORDER BY 1;
DATE_FORMAT(DATE_OF_BIRTH,'%m') = 03
→ 생일이 3월인 회원 필터링.AND GENDER = 'W'
→ 여성 회원만 조회.AND TLNO IS NOT NULL
→ 전화번호가 있는 회원만 필터링.ORDER BY MEMBER_ID
→ 회원 ID 기준 오름차순 정렬.CAR_RENTAL_COMPANY_CAR
테이블에서 자동차 종류가 '세단'인 자동차 중,SELECT DISTINCT(C.CAR_ID)
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE = '세단'
AND DATE_FORMAT(H.START_DATE,'%m') = 10
ORDER BY C.CAR_ID DESC;
INNER JOIN
을 사용하여 대여 기록이 있는 자동차만 필터링.DATE_FORMAT(H.START_DATE,'%m') = 10
→ 대여 시작일이 10월인 자동차만 조회.DISTINCT(C.CAR_ID)
→ 중복된 자동차 ID 제거.ORDER BY C.CAR_ID DESC
→ 자동차 ID 기준 내림차순 정렬.FOOD_PRODUCT
테이블에서 특정 카테고리(과자, 국, 김치, 식용유)별SELECT CATEGORY, MAX(PRICE) MAX_PRICE, PRODUCT_NAME
FROM (
SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
) a
GROUP BY 1
ORDER BY 2 DESC;
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
→ 특정 카테고리만 필터링.MAX(PRICE)
→ 각 카테고리별 최고 가격을 찾음.GROUP BY 1
→ 카테고리별로 그룹화.ORDER BY 2 DESC
→ 최고 가격 기준 내림차순 정렬.FOOD_PRODUCT
와 FOOD_ORDER
테이블을 JOIN하여PRODUCT_ID
오름차순 정렬.SELECT PRODUCT_ID,PRODUCT_NAME,SUM(PRICE*AMOUNT) PRICE
FROM (
SELECT P.PRODUCT_ID,P.PRODUCT_NAME,P.PRICE,O.AMOUNT
FROM FOOD_PRODUCT P
INNER JOIN FOOD_ORDER O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE DATE_FORMAT(O.PRODUCE_DATE,'%Y-%m') = '2022-05'
) a
GROUP BY 1
ORDER BY 3 DESC, 1;
INNER JOIN
을 사용하여 주문된 상품과 제품 정보를 결합.DATE_FORMAT(O.PRODUCE_DATE,'%Y-%m') = '2022-05'
→ 2022년 5월 생산된 제품만 조회.SUM(PRICE * AMOUNT)
→ 총매출 계산.ORDER BY 3 DESC, 1
→ 총매출 기준 내림차순 정렬, 동일한 경우 PRODUCT_ID 오름차순 정렬.ONLINE_SALE
테이블에서 동일한 회원(USER_ID
)이 동일한 상품(PRODUCT_ID
)을 재구매한 경우 조회.USER_ID
기준 오름차순 정렬, 동일한 경우 PRODUCT_ID
기준 내림차순 정렬.SELECT USER_ID,PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID,PRODUCT_ID
HAVING COUNT(1) >= 2
ORDER BY 1,2 DESC;
GROUP BY USER_ID, PRODUCT_ID
→ 회원별 구매한 상품 그룹화.HAVING COUNT(1) >= 2
→ 재구매가 발생한 경우만 필터링.ORDER BY 1,2 DESC
→ 회원 ID 기준 오름차순 정렬, 동일한 경우 PRODUCT_ID 기준 내림차순 정렬.USED_GOODS_BOARD
와 USED_GOODS_USER
테이블을 JOIN
하여전체주소
는 CITY + STREET_ADDRESS1 + STREET_ADDRESS2
로 출력.전화번호
는 xxx-xxxx-xxxx
형태로 변환.SELECT U.USER_ID,U.NICKNAME,
CONCAT(U.CITY,' ',U.STREET_ADDRESS1,' ',U.STREET_ADDRESS2) "전체주소",
CONCAT(SUBSTR(U.TLNO,1,3),'-',SUBSTR(U.TLNO,4,4),'-',SUBSTR(U.TLNO,8,4)) "전화번호"
FROM USED_GOODS_BOARD B
RIGHT JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
GROUP BY 1,2
HAVING COUNT(1) >= 3
ORDER BY U.USER_ID DESC;
GROUP BY
를 사용해 게시글을 3건 이상 등록한 사용자 필터링.CONCAT()
을 사용해 주소와 전화번호 형식 변환.ORDER BY U.USER_ID DESC
→ 사용자 ID 기준 내림차순 정렬.PRODUCT
테이블에서 만원 단위 가격대별 상품 개수를 구하는 문제.FLOOR
함수를 사용하여 가격대를 정리해야 함.SELECT
(FLOOR(PRICE / 10000) * 10000) AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
가격대를 10,000원 단위로 그룹화
FLOOR(PRICE / 10000) * 10000
PRICE / 10000
→ 가격을 10,000으로 나눠 정수 부분(몫)을 계산.FLOOR()
→ 내림 처리하여 가격대를 정리.* 10000
→ 다시 10,000을 곱해 가격 그룹을 원래 단위로 변환.PRICE = 9,000
→ (FLOOR(9000 / 10000) * 10000) = 0
PRICE = 15,000
→ (FLOOR(15000 / 10000) * 10000) = 10000
PRICE = 22,000
→ (FLOOR(22000 / 10000) * 10000) = 20000
상품 개수 집계 (COUNT(PRODUCT_ID)
)
PRICE_GROUP
을 가진 상품 개수 계산.GROUP BY PRICE_GROUP
을 사용하여 가격대별 그룹화
ORDER BY PRICE_GROUP
을 사용하여 가격대 기준 오름차순 정렬
0 → 10000 → 20000 → 30000
순으로 정렬.오늘 스파르타 내일배움캠프에서 여러 선생님의 직무 강의를 들었다. 그중에서도 서중욱 튜터님의 말씀이 가장 인상 깊었다.
나는 금융 데이터 도메인에 관심이 있어서 대학원 진학을 고민 중이었고, 이에 대해 직접 질문을 드려봤다. 돌아온 답변은 꽤나 뜻밖이었다.
원래는 고려대학교 통계학과만 생각하고 있었는데, 오늘 이야기를 듣고 카이스트 AI 대학원도 고려해봐야겠다는 생각이 들었다.
생각보다 튜터님이 너무 멋있는 사람들이라 거리가 있는 줄 알았지만 다들 너무 좋으신 분들인거 같다. 내 고민 하나하나 진심으로 상담해주시는게 너무 고마울 따름이다...