본문 바로가기
데이터베이스/MySQL

[MySQL] 프로그래머스스쿨 연습문제 Lv.3 모음1

by 상똥 2023. 4. 27.

1. 자동차 대여 기록에서 대여중/대여 가능 여부 구분하기

코딩테스트 연습 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
1. 같은 자동차의 대여-반납 기록이 여러개일 경우, START_DATE와 END_DATE를 기준으로 더 늦은 날짜인 기록을 기준으로 하기 위해 MAX를 사용한다.
1-1. 2022-10-16일을 넘는 대여기록이 없다면 대여 가능이 됨
2. CAR_ID를 기준으로 묶어준다.
회고
- MAX를 이렇게 쓸수도 있군요,, 배워갑니다
- IF문 : IF (조건, 조건 충족시 결과, 조건 미충족시 결과)
코드 (접은 글)
더보기
SELECT CAR_ID, MAX(CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중' 
                        ELSE '대여 가능' END) AVAILABILTY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

/*IF문 사용시*/
SELECT CAR_ID, IF (CAR_ID IN(
                   SELECT CAR_ID
                   FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                   WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE), '대여중', '대여 가능')
                   AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

 

2. 있었는데요 없었습니다

코딩테스트 연습 - 있었는데요 없었습니다 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
1. 두 테이블 모두를 참고하기 위해 FROM에 두 테이블 다 입력한다.
2. 두 테이블의 ANIMAL_ID가 같고, 입양 시각보다 보호 시작일이 더 늦으면 조회 가능
3. 여러 번 출력되지 않도록 ANIMAL_ID로 묶어준다.
회고
- WHERE절에서 기준을 잘 세워야 한다,,,,,,, ID같은 경우!!
코드 (접은 글)
더보기
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS, ANIMAL_OUTS
WHERE ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
      AND ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME
GROUP BY ANIMAL_INS.ANIMAL_ID
ORDER BY ANIMAL_INS.DATETIME

 

3. 오랜 기간 보호한 동물(1)

코딩테스트 연습 - 오랜 기간 보호한 동물(1) | 프로그래머스 스쿨 (programmers.co.kr)
풀이
1. 아직 입양을 못 간 동물 중에서 찾는 것이므로, 외래키와 NOT IN 사용
1-1. 외래키이므로 ANIMAL_OUT 은 FROM에 쓰지 않아도 되는듯
2. 보호 시작일을 빠른 순으로 정렬해야 함
3. 조회에 제한을 둬야 하므로 LIMIT 3
회고
- 오름차순,,, 헷갈리지마!!!!!!!!!!!!!!!!!!!!!
- LIMIT 조회에 제한 두기
코드 (접은 글)
더보기
SELECT NAME, DATETIME 
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN 
                (SELECT ANIMAL_ID 
                 FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3

 

4. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

코딩테스트 연습 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
1. 서브쿼리
1-1. 8~10월 중
1-2. CAR_ID로 묶음
1-3. HAVING COUNT(HISTORY_ID)>=5
2. 날짜를 8~10월 중으로 다시 제한한다.
회고
- 서브쿼리 빡세네,,
- HAVING 을 사용하면 몇회 이상 같은 조건을 사용하기 편리하다!
코드 (접은 글)
더보기
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE CAR_ID IN (SELECT CAR_ID
                 FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
                 WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
                 GROUP BY CAR_ID
                 HAVING COUNT(HISTORY_ID) >= 5) 
      AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH, CAR_ID
ORDER BY MONTH, CAR_ID DESC

 

5.  없어진 기록 찾기

코딩테스트 연습 - 없어진 기록 찾기 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
1. ANIMAL_ID와 NAME을 찾되, INS에는 없고 OUTS에는 있는 기록을 찾아야 하므로 NOT IN활용
2. 중복출력을 방지하기 위해 GROUP BY ANIMAL_ID
3. 외래키가 있으므로 서브쿼리 밖의 FROM에 ANIMAL_INS를 쓰지 않아도 됨
회고
무난하게 풀었다
코드 (접은 글)
더보기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN(SELECT ANIMAL_ID
                       FROM ANIMAL_INS)
GROUP BY ANIMAL_ID
ORDER BY ANIMAL_ID