프로그래머스 MySQL 레벨 2 문제풀이
1) 물고기 종류 별 잡은 수 구하기 (풀이 완료)
- 틀린 이유1: COUNT(*) 대신 SUM(*)을 사용함 SUM(*)은 없는 집계함수임 (SUM(변수명)은 가능)
- 틀린 이유2: LEFT JOIN 왼, 오 테이블 순서를 바꿔서 씀. SQL JOIN 개념 다시 공부해야 할듯
SELECT COUNT(*) AS FISH_COUNT, FISH_NAME
FROM FISH_INFO t1 LEFT JOIN FISH_NAME_INFO t2 USING (FISH_TYPE)
GROUP BY FISH_NAME
ORDER BY FISH_COUNT DESC;
2) 노선별 평균 역 사이 거리 조회하기 (풀이 실패)
- 반올림: ROUND(원래 값, 반올림 후 N번째 자리까지 표시)
- 틀린 이유: SELECT에서 TOTAL_DISTANCE 선언시 CONCAT으로 "km" 문자와 연결되며 TOTAL_DISTANCE 칼럼은 문자로 취급됨. 따라서 ORDER BY TOTAL_DISTANCE로 정렬시 정렬 순서가 문자열에 준하게 되어 숫자 정렬 순서와 달라짐
- ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) 을 사용해야 함 [참고]
SELECT ROUTE,
CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), "km") AS TOTAL_DISTANCE,
CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), "km") AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESC;
3) 연도 별 평균 미세먼지 농도 조회하기 (풀이 완료)
- DATE_FORMAT(YM, "%Y") 와 YEAR(YM)은 반환값의 타입이 달라 정렬(ORDER BY)이 다르게 됨
- 따라서 일반적인 숫자 정렬을 원할 때는 YEAR 사용
SELECT YEAR(YM) AS YEAR,
ROUND(AVG(PM_VAL1), 2) AS "PM10",
ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
WHERE LOCATION1 = "경기도" AND LOCATION2 = "수원"
GROUP BY YEAR
ORDER BY YEAR ASC;
4) 조건에 맞는 사원 정보 조회하기 (풀이 완료)
SELECT SCORE, EMP_NO, EMP_NAME, POSITION, EMAIL
FROM HR_EMPLOYEES t2 LEFT JOIN (
SELECT EMP_NO, SUM(SCORE) AS SCORE
FROM HR_GRADE
GROUP BY EMP_NO) t3 USING (EMP_NO)
ORDER BY SCORE DESC
LIMIT 1;
5) 조건에 맞는 개발자 찾기 (풀이 실패)
- 틀린 이유: 비트 연산(&)을 위해 스킬 코드 값을 BIN 함수로 이진수로 변환 → CONVERT 함수로 정수형으로 변환하려고 했음
- 비트 연산은 연산 대상 숫자 값을 이진수로 변환해주지 않아도 알아서 작동함
- WHERE 대신 JOIN을 활용하는 방법으로도 재풀이 필요
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE (SKILL_CODE&(SELECT CODE FROM SKILLCODES WHERE NAME = "C#") != 0)
OR (SKILL_CODE&(SELECT CODE FROM SKILLCODES WHERE NAME = "Python") != 0)
ORDER BY ID ASC;'SQL' 카테고리의 다른 글
| [SQL 쿼리테스트] 프로그래머스 Level1 복습 (0) | 2025.11.22 |
|---|---|
| [SQL 쿼리테스트] 6일차 (0) | 2025.08.22 |
| [SQL 쿼리테스트] 4일차 (0) | 2025.06.09 |
| [SQL 쿼리테스트] 3일차 (0) | 2025.06.08 |
| [SQL 쿼리테스트] 2일차 (4) | 2025.06.06 |