프로그래머스 SQL 고득점 Kit - String, Date 문제 풀이 모음 (MySQL)

정진희·2025년 5월 23일

SQL 문제 풀이

목록 보기
6/6
post-thumbnail

문제 푸는중~ / 아직 풀지 않는 문제의 풀이는 없습니다.

[Lv.1] - 특정 옵션이 포함된 자동차 리스트 구하기

SELECT CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY 1 DESC;

[Lv.1] - 한 해에 잡은 물고기 수 구하기

SELECT COUNT(ID) FISH_COUNT
FROM FISH_INFO
WHERE TIME LIKE '2021%';

[Lv.1] - 자동차 대여 기록에서 장기/단기 대여 구분하기

SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') START_DATE, DATE_FORMAT(END_DATE, '%Y-%m-%d') END_DATE, 
        IF(DATEDIFF(END_DATE, START_DATE) + 1 >= 30, '장기 대여', '단기 대여') RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE START_DATE LIKE '2022-09%'
ORDER BY 1 DESC;

[Lv.2] - 이름에 el이 들어가는 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE = 'Dog'
ORDER BY 2;

[Lv.2] - DATETIME에서 DATE로 형 변환

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS;

[Lv.2] - 카테고리 별 상품 개수 구하기

  • LEFT(문자열, 왼쪽부터 자를 길이)
  • 풀이 1

    SELECT CATEGORY, COUNT(CATEGORY) AS PRODUCTS
    FROM (SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY FROM PRODUCT) AS C
    GROUP BY CATEGORY
    ORDER BY CATEGORY;
  • 풀이 2

    SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
    FROM PRODUCT
    GROUP BY CATEGORY
    ORDER BY CATEGORY;

[Lv.2] - 중성화 여부 파악하기

SELECT ANIMAL_ID, NAME, 
       CASE 
            WHEN SEX_UPON_INTAKE LIKE 'Intact %' THEN 'X'
            ELSE 'O'
       END AS '중성화'
FROM ANIMAL_INS;

[Lv.2] - 루시와 엘라 찾기

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS 
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty');

[Lv.2] - 연도 별 평균 미세먼지 농도 조회하기

  • PM2.5 의 . 처럼 특수 문자를 포함한 경우 오류가 날 수 있음

    • 별칭은 그냥 쓰기 또는 ""(큰 따옴표) / 문자열은 ''(작은 따옴표)
    SELECT YEAR(YM) YEAR, ROUND(AVG(PM_VAL1), 2) PM10, ROUND(AVG(PM_VAL2), 2) "PM2.5"
    FROM AIR_POLLUTION
    WHERE LOCATION2 = '수원' 
    GROUP BY YEAR(YM)
    ORDER BY YEAR;

[Lv.3] - 조건별로 분류하여 주문상태 출력하기

  • 풀이 1

    SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE, 
            CASE
                WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
                WHEN OUT_DATE IS NULL THEN '출고미정'
                ELSE '출고대기'
            END 출고여부
    FROM FOOD_ORDER
    ORDER BY 1;
  • 풀이 2

    • DATEDIFF(날짜1, 날짜2) : 날짜1 - 날짜2 한 차이를 일수로 반환
    SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE, 
            CASE
                WHEN DATEDIFF('2022-05-01', OUT_DATE) >= 0 THEN '출고완료'
                WHEN DATEDIFF('2022-05-01', OUT_DATE) < 0 THEN '출고대기'
                ELSE '출고미정'
            END 출고여부
    FROM FOOD_ORDER
    ORDER BY 1;

[Lv.3] - 대여 기록이 존재하는 자동차 리스트 구하기

SELECT DISTINCT CAR_ID
FROM CAR_RENTAL_COMPANY_CAR JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY USING (CAR_ID)
WHERE CAR_TYPE LIKE '세단' AND START_DATE LIKE '%-10-%'
ORDER BY 1 DESC;

[Lv.3] - 오랜 기간 보호한 동물(2)

  • ORDER BY TIMEDIFF(O.DATETIME, I.DATETIME) DESC가 안되는 이유
    • TIMEDIFF(나중날짜, 먼저날짜)는 시간(HH:MM:SS) 형태로 차이를 반환한다.
    • TIMEDIFF로 정렬한다면 문자열 기준으로 비교하기 때문에, 시간이 100시간이 넘어가면 정렬 오류가 생길 수도 있다.
      • 예시 : '99:00:00' > '100:00:00' (문자열 비교 기준)
    SELECT I.ANIMAL_ID, I.NAME
    FROM ANIMAL_INS I JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
    WHERE O.ANIMAL_ID IS NOT NULL
    -- ORDER BY (O.DATETIME - I.DATETIME) DESC -- 이것도 정답이 됨
    ORDER BY TIMESTAMPDIFF(SECOND, I.DATETIME, O.DATETIME) DESC
    LIMIT 2;
profile
고민하고, 공부해서 발전하는 개발자가 되자🔥

0개의 댓글