2025.02.19 본_캠프 3일차

민동·2025년 2월 19일
0

본캠프

목록 보기
3/74
post-thumbnail

SQL 문제 정리


1. 입양을 간 동물 중 보호 기간이 가장 길었던 동물 조회

문제: 입양된 동물 중 보호 기간이 가장 길었던 두 마리의 아이디와 이름을 조회하기.

SQL 쿼리:

SELECT A_I.ANIMAL_ID, A_I.NAME
FROM ANIMAL_INS A_I
INNER JOIN ANIMAL_OUTS A_O ON A_I.ANIMAL_ID = A_O.ANIMAL_ID
ORDER BY DATEDIFF(A_O.DATETIME, A_I.DATETIME) DESC
LIMIT 2;

쿼리 설명:

  • INNER JOIN을 사용해 입양된 동물(ANIMAL_INS & ANIMAL_OUTS)을 매칭.
  • DATEDIFF(A_O.DATETIME, A_I.DATETIME)을 이용해 보호 기간을 계산.
  • ORDER BY DESC를 사용하여 보호 기간이 긴 순서대로 정렬.
  • LIMIT 2를 통해 보호 기간이 가장 긴 2마리 조회.

2. 보호소에서 중성화된 동물 조회

문제: 입소 시 중성화되지 않았지만, 출소 시 중성화된 동물 조회.
SQL 쿼리:

SELECT A_I.ANIMAL_ID,A_I.ANIMAL_TYPE,A_I.NAME
FROM ANIMAL_OUTS A_O INNER JOIN ANIMAL_INS A_I ON A_O.ANIMAL_ID = A_I.ANIMAL_ID
WHERE A_I.SEX_UPON_INTAKE LIKE '%intact%' AND (A_O.SEX_UPON_OUTCOME LIKE '%Spayed %' OR
      A_O.SEX_UPON_OUTCOME LIKE '%Neutered %')
ORDER BY A_I.ANIMAL_ID;

쿼리 설명:

  • INNER JOIN을 이용해 입소(ANIMAL_INS)와 출소(ANIMAL_OUTS) 데이터를 연결.
  • LIKE '%Intact%'를 사용해 중성화되지 않은 상태로 들어온 동물을 필터링.
  • LIKE '%Spayed%' OR LIKE '%Neutered%'을 사용해 출소 시 중성화된 동물만 조회.

3. 출고 여부를 기준으로 주문 데이터 조회

문제: 출고일 기준으로 '출고완료', '출고대기', '출고미정' 상태 분류.
SQL 쿼리:

SELECT order_id,product_id,DATE_FORMAT(date(out_date), '%Y-%m-%d') out_date,
    CASE WHEN out_date <= '2022-05-01' THEN '출고완료'
   		 WHEN out_date > '2022-05-01' THEN '출고대기'
   		 ELSE '출고미정' END '출고여부'
FROM food_order
ORDER BY order_id;

쿼리 설명:

  • CASE 문을 이용해 출고 여부를 분류.
  • NULL이면 '출고미정', 2022-05-01 이전이면 '출고완료', 이후면 '출고대기'.
  • ORDER BY ORDER_ID주문 ID 기준 정렬.

4. 아이스크림 성분별 총 주문량 조회

문제: 성분(sugar_based, fruit_based)별 아이스크림 총 주문량을 조회하고 주문량이 작은 순으로 정렬.
SQL 쿼리:

SELECT I.INGREDIENT_TYPE,SUM(F.TOTAL_ORDER )TOTAL_ORDER
FROM FIRST_HALF F INNER JOIN ICECREAM_INFO I ON F.FLAVOR = I.FLAVOR 
GROUP BY 1
ORDER BY 2;

쿼리 설명:

  • INNER JOIN을 통해 아이스크림 맛(FLAVOR)과 성분(INGREDIENT_TYPE) 연결.
  • SUM(TOTAL_ORDER)을 사용해 성분별 총 주문량 계산.
  • ORDER BY TOTAL_ORDER 주문량이 적은 순 정렬.

5. 2021년에 출판된 '인문' 카테고리 도서 조회

문제: 2021년에 출판된 '인문' 도서를 조회하고 출판일 기준 오름차순 정렬.
SQL 쿼리:

SELECT BOOK_ID,DATE_FORMAT(PUBLISHED_DATE,'%Y-%m-%d') PUBLISHED_DATE
FROM BOOK
WHERE DATE_FORMAT(PUBLISHED_DATE,'%Y') = '2021' AND CATEGORY = '인문'
ORDER BY 2

쿼리 설명:

  • WHERE CATEGORY = '인문'으로 인문 도서만 필터링.
  • YEAR(PUBLISHED_DATE) = 2021로 2021년에 출판된 도서만 조회.
  • DATE_FORMAT(PUBLISHED_DATE, '%Y')로 날짜 포맷을 맞춤.
  • ORDER BY PUBLISHED_DATE로 출판일이 오래된 순 정렬.

6. SUV 자동차의 평균 일일 대여 요금 조회

문제: 'SUV' 자동차들의 평균 일일 대여 요금을 구하고 소수 첫째 자리에서 반올림.
SQL 쿼리:

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

쿼리 설명:

  • AVG(DAILY_FEE)를 사용해 'SUV' 자동차들의 평균 일일 대여 요금을 계산.
  • ROUND()를 사용해 소수 첫째 자리에서 반올림.

7. 완료된 거래 금액이 70만 원 이상인 사용자 조회

문제: 완료된(DONE) 거래만 합산하여 70만 원 이상인 사용자 조회, 총 거래 금액 기준 정렬.
SQL 쿼리:

SELECT U.USER_ID,U.NICKNAME,SUM(B.PRICE) TOTAL_SALES
FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY 1,2
HAVING TOTAL_SALES >= 700000
ORDER BY 3;

쿼리 설명:

  • INNER JOIN을 통해 중고 거래 정보와 사용자 정보 연결.
  • WHERE STATUS = 'DONE'을 사용해 거래 완료된 데이터만 필터링.
  • SUM(PRICE)를 사용해 사용자별 총 거래 금액 계산.
  • HAVING TOTAL_SALES >= 700000을 사용해 70만 원 이상 거래한 사용자 조회.
  • ORDER BY TOTAL_SALES로 총 거래 금액 기준 오름차순 정렬.

오늘의 핵심 SQL 개념

  • JOIN: 여러 테이블을 연결하여 데이터 조회
  • CASE: 특정 조건에 따라 데이터 분류
  • DATE_FORMAT(): 날짜 형식 맞추기
  • SUM(), AVG(), ROUND(): 데이터 집계 및 가공
  • HAVING: 그룹화된 데이터에서 특정 조건 필터링
    (GROUP BY의 WHERE 느낌인거 같음.)
profile
아자아자

0개의 댓글