on my way
[프로그래머스 코딩테스트 연습 SQL] 특정한 조건을 만족하는 물고기별 수와 최대 길이 구하기 (MySQL) | COALESCE 본문
algorithm/SQL
[프로그래머스 코딩테스트 연습 SQL] 특정한 조건을 만족하는 물고기별 수와 최대 길이 구하기 (MySQL) | COALESCE
wingbeat 2024. 9. 16. 03:26반응형
내가 처음 푼 코드
SELECT COUNT(*) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
WHERE FISH_TYPE IN (SELECT FISH_TYPE
FROM (SELECT FISH_TYPE, CASE WHEN ISNULL(LENGTH) THEN 10 ELSE LENGTH END AS LENGTH
FROM FISH_INFO) AS T
GROUP BY FISH_TYPE
HAVING AVG(LENGTH) >= 33)
GROUP BY FISH_TYPE
ORDER BY FISH_TYPE
평가
- 정확성 (5점 만점 중 3.5점)
- 주어진 문제를 해결하는 데 있어서 기본적인 로직은 잘 잡았고,
COUNT
,MAX
,GROUP BY
등의 함수도 올바르게 사용했다. - 그러나
WHERE FISH_TYPE IN
조건이 너무 복잡하게 작성되었고,HAVING
절 내에서AVG(LENGTH)
를 구하는 부분에서 리팩토링이 가능하다. - 또한,
ISNULL(LENGTH)
대신COALESCE
함수가 더 적합한 상황이다.
- 주어진 문제를 해결하는 데 있어서 기본적인 로직은 잘 잡았고,
- 효율성 (5점 만점 중 3점)
- 문제 해결 방식은 맞지만, 코드가 중복 계산을 포함하고 있어서 비효율적이다. 예를 들어, 서브쿼리 내에서
CASE
로LENGTH
가 10 이하인 값을 처리하는 부분은 메인 쿼리로도 해결할 수 있다. - 서브쿼리를 줄이면 쿼리의 속도가 향상될 수 있다.
- 문제 해결 방식은 맞지만, 코드가 중복 계산을 포함하고 있어서 비효율적이다. 예를 들어, 서브쿼리 내에서
- 가독성 (5점 만점 중 3점)
- 쿼리의 복잡성 때문에 가독성이 떨어진다. 서브쿼리를 줄이거나 간단한 조인으로 바꾼다면 가독성이 높아질 수 있다.
해설
- 쿼리의 구조
- 사용된
FISH_TYPE IN
구문은 평균 길이를 계산하고 조건을 만족하는 경우에만 필터링하는 방식이다. - 또한
ISNULL
로LENGTH
가 10 이하인 경우를 처리했으나, 이는COALESCE
함수가 더 적절하다.COALESCE
는 첫 번째로 NULL이 아닌 값을 반환하는 함수이기 때문에 좀 더 직관적이다. - 서브쿼리를 줄일 수 있다. 전체적으로 조건을 조금 더 간결하게 작성하는 방법이 있다.
- 사용된
리팩토링
SELECT COUNT(*) AS FISH_COUNT, MAX(COALESCE(LENGTH, 10)) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(COALESCE(LENGTH, 10)) >= 33
ORDER BY FISH_TYPE;
리팩토링 설명
- COALESCE 사용:
ISNULL
대신COALESCE(LENGTH, 10)
을 사용하여LENGTH
가 NULL인 경우를 처리했다. 이 함수는NULL
이 아닌 첫 번째 값을 반환한다. - 서브쿼리 제거:
FISH_TYPE IN
구문을 제거하고, 메인 쿼리 내에서 바로 평균 길이를 필터링할 수 있도록HAVING AVG(COALESCE(LENGTH, 10)) >= 33
구문을 사용했다. - 가독성 개선: 서브쿼리와 복잡한 조건을 간단하게 정리하여 가독성을 높였다.
리팩토링한 코드로는 불필요한 계산과 복잡한 서브쿼리를 줄이면서 동일한 결과를 얻을 수 있게 했다.
반응형
'algorithm > SQL' 카테고리의 다른 글
[프로그래머스 코딩테스트 연습 SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 (MySQL) | RANK() 함수 (0) | 2024.08.04 |
---|---|
[프로그래머스 코딩테스트 연습 SQL] 업그레이드 된 아이템 구하기 (MySQL) (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산 (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습 SQL - 13] 노선별 평균 역 사이 거리 조회하기 (MySQL) (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습 SQL - 12] 조건별로 분류하여 주문상태 출력하기 (MySQL) (0) | 2024.07.16 |