프로그래머스 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) 조건에 부합하는 중고거래 댓글 조회하기 (풀이 실패)
- 틀린 이유: JOIN 부분이 잘못된 것 같음
- 질답 게시판 바로가기
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 |