2025.02.20 본_캠프 4일차

민동·2025년 2월 20일
0

본캠프

목록 보기
4/74
post-thumbnail

📌 2025-02-20 SQL 공부 정리

오늘은 SQL 문제 풀이를 통해 다양한 실전 개념을 익혔다.
내가 직접 작성한 SQL 쿼리를 중심으로 정리하고, 쿼리별 설명을 추가하였다.


1. 가격대 별 상품 개수 구하기

문제 개요

  • PRODUCT 테이블에서 만원 단위 가격대별 상품 개수를 구하는 문제.
  • 결과는 가격대 기준 오름차순 정렬.

사용한 SQL

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을 사용해 가격 그룹 오름차순 정렬.

2. 3월에 태어난 여성 회원 조회

문제 개요

  • MEMBER_PROFILE 테이블에서 생일이 3월여성 회원을 조회하는 문제.
  • 결과는 MEMBER_ID 오름차순 정렬.

사용한 SQL

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 기준 오름차순 정렬.

3. 대여 기록이 존재하는 자동차 조회

문제 개요

  • CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 '세단'인 자동차 중,
    10월에 대여를 시작한 기록이 있는 자동차 ID 리스트 조회.
  • 자동차 ID는 중복 없이, 내림차순 정렬.

사용한 SQL

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 기준 내림차순 정렬.

4. 식품분류별 가장 비싼 식품 조회

문제 개요

  • FOOD_PRODUCT 테이블에서 특정 카테고리(과자, 국, 김치, 식용유)별
    가장 비싼 식품의 분류, 가격, 이름을 조회하는 문제.
  • 결과는 가격 기준 내림차순 정렬.

사용한 SQL

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최고 가격 기준 내림차순 정렬.

5. 5월 생산된 식품의 총매출 조회

문제 개요

  • FOOD_PRODUCTFOOD_ORDER 테이블을 JOIN하여
    2022년 5월 생산된 식품의 총매출 조회.
  • 결과는 총매출 기준 내림차순 정렬, 동일한 경우 PRODUCT_ID 오름차순 정렬.

사용한 SQL

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 오름차순 정렬.

6. 재구매가 일어난 상품과 회원 조회

문제 개요

  • ONLINE_SALE 테이블에서 동일한 회원(USER_ID)이 동일한 상품(PRODUCT_ID)을 재구매한 경우 조회.
  • USER_ID 기준 오름차순 정렬, 동일한 경우 PRODUCT_ID 기준 내림차순 정렬.

사용한 SQL

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 기준 내림차순 정렬.

7. 중고 거래 게시물을 3건 이상 등록한 사용자 조회

문제 개요

  • USED_GOODS_BOARDUSED_GOODS_USER 테이블을 JOIN하여
    게시글을 3건 이상 등록한 사용자의 정보 조회.
  • 전체주소CITY + STREET_ADDRESS1 + STREET_ADDRESS2로 출력.
  • 전화번호xxx-xxxx-xxxx 형태로 변환.

사용한 SQL

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 기준 내림차순 정렬.

8. 가격대 별 상품 개수 구하기 (FLOOR 함수 사용)

문제 개요

  • PRODUCT 테이블에서 만원 단위 가격대별 상품 개수를 구하는 문제.
  • FLOOR 함수를 사용하여 가격대를 정리해야 함.
  • 결과는 가격대 기준 오름차순 정렬.

사용한 SQL

SELECT 
    (FLOOR(PRICE / 10000) * 10000) AS PRICE_GROUP,
    COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;

쿼리 설명

  1. 가격대를 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
  2. 상품 개수 집계 (COUNT(PRODUCT_ID))

    • 같은 PRICE_GROUP을 가진 상품 개수 계산.
  3. GROUP BY PRICE_GROUP을 사용하여 가격대별 그룹화

    • 동일한 가격대 상품끼리 묶어서 개수 집계.
  4. ORDER BY PRICE_GROUP을 사용하여 가격대 기준 오름차순 정렬

    • 0 → 10000 → 20000 → 30000 순으로 정렬.

오늘의 기록: 내일배움캠프에서 얻은 인사이트

오늘 스파르타 내일배움캠프에서 여러 선생님의 직무 강의를 들었다. 그중에서도 서중욱 튜터님의 말씀이 가장 인상 깊었다.

나는 금융 데이터 도메인에 관심이 있어서 대학원 진학을 고민 중이었고, 이에 대해 직접 질문을 드려봤다. 돌아온 답변은 꽤나 뜻밖이었다.

  • 입학 시험보다 컨택이 더 중요할 수도 있다.
  • CV 작성 시 내가 했던 프로젝트들을 잘 정리하는 것이 핵심이다.
  • 예전에 논문을 쓴 경험이 있는데, 사실 부끄러워서 넣지 않으려 했다. 하지만 논문을 써봤다는 것 자체가 강점이 될 수 있다는 점을 새롭게 깨달았다.

원래는 고려대학교 통계학과만 생각하고 있었는데, 오늘 이야기를 듣고 카이스트 AI 대학원도 고려해봐야겠다는 생각이 들었다.

생각보다 튜터님이 너무 멋있는 사람들이라 거리가 있는 줄 알았지만 다들 너무 좋으신 분들인거 같다. 내 고민 하나하나 진심으로 상담해주시는게 너무 고마울 따름이다...

profile
아자아자

0개의 댓글