728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/293261
정답 풀이
SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info
INNER JOIN FISH_NAME_INFO name ON info.FISH_TYPE = name.FISH_TYPE
WHERE (info.FISH_TYPE, info.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE)
ORDER BY info.ID;
풀이 방법
물고기 종류 별로 가장 큰 물고기에 대한 정보를 출력하는 문제이다.
문제에서 주어진 조건은 다음과 같다.
- 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력
- 물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH
- 물고기의 ID에 대해 오름차순
- 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없다.
이제 차근차근 쉽게 문제를 해결해보자!
1. 먼저, 각 물고기 종류별 최대 길이를 찾는 서브쿼리를 작성해본다.
SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
GROUP BY FISH_TYPE;
2. 메인 쿼리와 서브 쿼리를 결합한다.
IN 연산자를 이용해 서브쿼리의 결과와 매칭되는 결과를 필터링한다.
SELECT info.ID, info.FISH_TYPE, info.LENGTH
FROM FISH_INFO info
WHERE (info.FISH_TYPE, info.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
GROUP BY FISH_TYPE
);
3. 문제의 조건에 맞게 테이블명, 정렬 방법을 지정해준다.
SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info
INNER JOIN FISH_NAME_INFO name ON info.FISH_TYPE = name.FISH_TYPE
WHERE (info.FISH_TYPE, info.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
GROUP BY FISH_TYPE
)
ORDER BY info.ID;
다른 방법
서브쿼리를 사용하는 방법 말고도 CTE를 사용하는 방법도 있다.
CTE(Common Table Expressions)는 쿼리의 중간 결과를 임시로 저장하고 사용할 수 있는 구조로,
WITH 키워드를 통해 지정할 수 있다.
WITH MaxLengthPerType AS (
SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
GROUP BY FISH_TYPE
)
SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info
INNER JOIN MaxLengthPerType maxLen
ON info.FISH_TYPE = maxLen.FISH_TYPE AND info.LENGTH = maxLen.MAX_LENGTH
INNER JOIN FISH_NAME_INFO name
ON info.FISH_TYPE = name.FISH_TYPE
ORDER BY info.ID;
위와 같이 'MaxLengthPerType' 이라는 CTE를 정의하여, 메인 쿼리와 조인한 후, 원하는 결과를 뽑아낼 수도 있다.
728x90
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스][MySQL] Lv. 3 업그레이드 할 수 없는 아이템 구하기 (1) | 2024.07.16 |
---|---|
[프로그래머스][MySQL] Lv. 2 연도별 대장균 크기의 편차 구하기 (0) | 2024.07.15 |
[프로그래머스][MySQL] Lv. 2 중복 제거하기 (0) | 2024.07.15 |
[프로그래머스][MySQL] Lv. 2 특정 물고기를 잡은 총 수 구하기 (0) | 2024.07.15 |
[프로그래머스][MySQL] Lv. 2 동명 동물 수 찾기 (0) | 2024.07.12 |