문제: 입양된 동물 중 보호 기간이 가장 길었던 두 마리의 아이디와 이름을 조회하기.
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마리 조회.문제: 입소 시 중성화되지 않았지만, 출소 시 중성화된 동물 조회.
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%'
을 사용해 출소 시 중성화된 동물만 조회.문제: 출고일 기준으로 '출고완료', '출고대기', '출고미정' 상태 분류.
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 기준 정렬.문제: 성분(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
로 주문량이 적은 순 정렬.문제: 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
로 출판일이 오래된 순 정렬.문제: 'SUV' 자동차들의 평균 일일 대여 요금을 구하고 소수 첫째 자리에서 반올림.
SQL 쿼리:
SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';
쿼리 설명:
AVG(DAILY_FEE)
를 사용해 'SUV' 자동차들의 평균 일일 대여 요금을 계산.ROUND()
를 사용해 소수 첫째 자리에서 반올림.문제: 완료된(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
: 그룹화된 데이터에서 특정 조건 필터링