SQL

[실무]프로그래머스 MySQL 기출문제 모음 Lv.3.2

노력하는 백곰 2024. 6. 5. 17:47

■ 출처

- 코딩테스트 : MySQL / Oracle / Lv.3

https://school.programmers.co.kr/learn/challenges?order=recent&languages=mysql%2Coracle&page=1&levels=3

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

 

 

연습문제

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