■ 출처
- 코딩테스트 : MySQL / Oracle / Lv.3
■ 연습문제
11. 대여 기록이 존재하는 자동차 리스트 구하기
#설명: 세단 자동차 중 10월에 대여를 시작한 기록이 있는 자동차 ID를 조회
SELECT
DISTINCT A_Table.CAR_ID
FROM
CAR_RENTAL_COMPANY_CAR AS A_Table
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS B_Table
ON A_Table.CAR_ID = B_Table.CAR_ID
WHERE
(A_Table.CAR_TYPE = '세단') AND (B_Table.START_DATE LIKE "%-10-%")
ORDER BY
A_Table.CAR_ID DESC
12. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
#설명: 22.10.16에 대여 여부 컬럼을 추가하여 자동차 ID와 함께 조회
SELECT
CAR_ID,
MAX(CASE WHEN '2022-10-16'
BETWEEN DATE_FORMAT(START_DATE,'%Y-%m-%d') AND DATE_FORMAT(END_DATE,'%Y-%m-%d') THEN '대여중'
ELSE '대여 가능' END) AS AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY
CAR_ID
ORDER BY
CAR_ID DESC
13. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
중첩 서브쿼리(Nested Subquery) :
-WHERE/HAVING 구문과 같은 조건절에 사용하는 서브쿼리
-메인쿼리의 조건을 결정하기 위해 서브쿼리의 결과를 비교
-서브쿼리는 메인쿼리의 조건을 평가하는데 사용되며, 서브쿼리의 결과는 단일 값, 다중 값, 혹은 테이블이 될 수 있음
-비연관 서브쿼리일 경우, 메인쿼리보다 먼저 실행
-연관 서브쿼리는 메인쿼리의 각 행에 대해 반본적으로 실행
인라인 뷰(Inline View) :
-FROM 구문에 위치하는 서브쿼리로 임시 테이블을 반환(즉, 하나의 테이블처럼 사용)
-반환한 테이블을 메인쿼리에 제공
#설명: 대여 시작일을 기준 22.08~22.10까지 총 대여횟수가 5회 이상 자동차에 대해 월별 자동차별 총 대여횟수 조회
SELECT
MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(HISTORY_ID) AS RECORDS
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE
MONTH(START_DATE) IN (8, 9, 10) #MONTH) 22.08~22.10까지 대여일 설정
AND CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) IN (8, 9, 10)
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5) #CAR_ID) 총 5회 이상의 대여횟수 ID 설정
GROUP BY
MONTH, CAR_ID
ORDER BY
MONTH ASC, CAR_ID DESC
14. 카테고리 별 도서 판매량 집계하기
#설명: 22.01의 카테고리별 도서 판매량을 합산하여, 카테고리별 총 판매량을 조회
SELECT
A_Table.CATEGORY,
SUM(B_Table.SALES) AS TOTAL_SALES
FROM
BOOK AS A_Table
INNER JOIN BOOK_SALES AS B_Table
ON A_Table.BOOK_ID = B_Table.BOOK_ID
WHERE
B_Table.SALES_DATE LIKE '2022-01-%'
GROUP BY
A_Table.CATEGORY
ORDER BY
A_Table.CATEGORY ASC
15. 즐겨찾기가 가장 많은 식당 정보 출력하기
#설명: 음식종류별 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당명, 즐겨찾기 수를 조회
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
FAVORITES
FROM
REST_INFO
WHERE
FOOD_TYPE IN (SELECT FOOD_TYPE
FROM REST_INFO
GROUP BY FOOD_TYPE
HAVING FAVORITES = MAX(FAVORITES))
ORDER BY
FOOD_TYPE DESC
16. 조건별로 분류하여 주문상태 출력하기
#설명: 22.05.01 기준으로 주문ID, 제품ID, 출고일자, 출고여부를 조회
SELECT
ORDER_ID,
PRODUCT_ID,
DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE,
(CASE WHEN DATE_FORMAT(OUT_DATE,'%Y-%m-%d')<='2022-05-01'THEN'출고완료'
WHEN DATE_FORMAT(OUT_DATE,'%Y-%m-%d')>'2022-05-01'THEN'출고대기'ELSE'출고미정'END) AS '출고여부'
FROM
FOOD_ORDER
ORDER BY
ORDER_ID ASC
17. 헤비 유저가 소유한 장소
#설명: 헤비 유저(서비스에 공간을 둘 이상 등록한 유저)가 등록한 공간의 정보를 아이디 순으로 조회
SELECT
*
FROM
PLACES
WHERE
HOST_ID IN (SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2)
ORDER BY
ID ASC
18. 오랜 기간 보호한 동물(2)
#설명: 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회
SELECT
A_Table.ANIMAL_ID,
A_Table.NAME
FROM
ANIMAL_INS AS A_Table
LEFT JOIN ANIMAL_OUTS AS B_Table
ON A_Table.ANIMAL_ID = B_Table.ANIMAL_ID
ORDER BY
#입양일에서 보호 시작일을 빼고 내림차순으로 총 보호시간을 조회
(B_Table.DATETIME-A_Table.DATETIME) DESC
LIMIT
2
19. 오랜 기간 보호한 동물(1)
#설명: 입양을 가지 못한 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회
SELECT
A_Table.NAME,
A_Table.DATETIME
FROM
ANIMAL_INS AS A_Table
LEFT JOIN ANIMAL_OUTS AS B_Table
ON A_Table.ANIMAL_ID = B_Table.ANIMAL_ID
WHERE
B_Table.DATETIME IS NULL
ORDER BY
A_Table.DATETIME
LIMIT
3
20. 있었는데요 없었습니다
#설명: 관리자 실수로 일부 동물 입양일이 잘못 입력되어, 보호 시작일보다 입양일이 빠른 동물의 아이디와 이름을 조회
SELECT
A_Table.ANIMAL_ID,
A_Table.NAME
FROM
ANIMAL_INS AS A_Table
INNER JOIN ANIMAL_OUTS AS B_Table
ON A_Table.ANIMAL_ID = B_Table.ANIMAL_ID
WHERE
A_Table.DATETIME > B_Table.DATETIME
ORDER BY
A_Table.DATETIME ASC
21. 없어진 기록 찾기
#설명: 천재지변으로 데이터가 유실되어, 입양 기록은 존재하는데 보호소 기록은 없는 동물이 존재하여 ID, 이름을 조회
SELECT
B_Table.ANIMAL_ID,
B_Table.NAME
FROM
ANIMAL_INS AS A_Table
RIGHT JOIN ANIMAL_OUTS AS B_Table
ON A_Table.ANIMAL_ID = B_Table.ANIMAL_ID
WHERE
A_Table.DATETIME IS NULL