SQL

[SQL 쿼리테스트] 1일차

지구(Jigoo) 2025. 6. 5. 20:54

프로그래머스 MySQL 레벨 1 문제 풀이

 

1) 특정 형질을 가지는 대장균 찾기 (풀이 실패)

  • 십진수를 이진수로 변환: CONV(칼럼명, 10, 2)
  • 텍스트 일부 추출: SUBSTRING(칼럼명, 시작 인덱스, 추출할 글자 개수)
    • 인덱스는 1부터 시작, 마지막 인덱스는 -1로 지정 가능
    • MID 도 동일함
  • 글자 개수: CHAR_LENGTH(칼럼명)
  • 바이트 수: LENGTH(칼럼명)
  • 틀린 이유: 비트연산 풀이를 모름

2) 가장 큰 물고기 10마리 구하기 (풀이 완료)

SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID ASC
LIMIT 10;

 

3) 한 해에 잡은 물고기 수 구하기 (풀이 완료) 

SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE TIME LIKE "2021%";

 

4) 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (풀이 완료)

  • 문자열 이어 붙이기
    • CONCAT("문자1", "문자2", "문자3")
    • "문자1" + "문자2" + "문자3"
SELECT CONCAT(MAX(LENGTH), "cm") AS MAX_LENGTH
FROM FISH_INFO;

 

5) 잡은 물고기의 평균 길이 구하기 (풀이 실패)

  • 소수점 반올림: ROUND(칼럼명,  반올림 후 소수점 N번째 자리까지 표시)
  • CASE 구문:
    • CASE (칼럼명 조건) THEN 값
    • ELSE 값
    • END
  • 틀린 이유: CASE 구문
SELECT ROUND(AVG(CASE
                WHEN (LENGTH <= 10 OR LENGTH IS NULL) THEN 10
                ELSE LENGTH
                END), 2) AS AVERAGE_LENGTH
FROM FISH_INFO;

 

6) 잔챙이 잡은 수 구하기 (풀이 완료)

SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL;

 

7) Python 개발자 찾기 (풀이 완료)

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE (SKILL_1 = "Python") OR (SKILL_2 = "Python") OR (SKILL_3 = "Python")
ORDER BY ID ASC;
  • IN 활용 가능
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE "Python" IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID ASC;

 

8) 조건에 부합하는 중고거래 댓글 조회하기 (풀이 실패)

SELECT t1.TITLE, t1.BOARD_ID, t2.REPLY_ID, t2.WRITER_ID, t2.CONTENTS, t2.CREATED_DATE
FROM USED_GOODS_BOARD t1 INNER JOIN USED_GOODS_REPLY t2 USING (BOARD_ID)
WHERE t1.CREATED_DATE LIKE "2022-10%" AND t2.CREATED_DATE LIKE "2022-10%"
ORDER BY t2.CREATED_DATE ASC, t1.TITLE ASC;

 

9) 특정 옵션이 포함된 자동차 리스트 구하기 (풀이 완료)

  • MySQL에는 CONTAINS 함수 없음, 대신 LIKE 사용
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE "%네비게이션%"
ORDER BY CAR_ID DESC;

 

10) 자동차 대여 기록에서 장기/단기 대여 구분하기 (풀이 실패)

  • 날짜 포맷 설정: DATE_FORMAT(칼럼명, 포맷)
    • YYYY-MM-DD 는 "%Y-%m-%d"
  • 일단위 날짜 차이 계산: DATEDIFF(이후 날짜, 이전 날짜)
  • 틀린 이유
    • DATEDIFF 함수 대신 - 기호로 날짜 차이를 계산하려고 했음
    • 대여 일자와 반납 일자가 같은 날도 하루 대여로 간주해야 하는 걸 놓침
      • 따라서 DATEDIFF 값 + 1 >= 30 조건을 사용해야 함
    • 대여 시작일이 2022년 09월이라는 조건을 놓침
SELECT history_id, car_id, DATE_FORMAT(start_date, "%Y-%m-%d"), DATE_FORMAT(end_date, "%Y-%m-%d"), (CASE WHEN DATEDIFF(end_date, start_date) + 1 >= 30 THEN "장기 대여"
               ELSE "단기 대여"
               END) AS "RENT_TYPE"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, "%Y-%m-%d") LIKE "2022-09%"
ORDER BY history_id DESC;

'SQL' 카테고리의 다른 글

[SQL 쿼리테스트] 6일차  (0) 2025.08.22
[SQL 쿼리테스트] 5일차  (2) 2025.07.15
[SQL 쿼리테스트] 4일차  (0) 2025.06.09
[SQL 쿼리테스트] 3일차  (0) 2025.06.08
[SQL 쿼리테스트] 2일차  (4) 2025.06.06