FISH_INFO 테이블과 FISH_NAME_INFO 테이블을 활용해 물고기 종류별로 가장 큰 물고기의 ID, 이름, 길이를 ID 오름차순으로 조회하는 문제이다.
| 테이블 | 주요 컬럼 |
|---|---|
FISH_INFO | ID, FISH_TYPE, LENGTH |
FISH_NAME_INFO | FISH_TYPE, FISH_NAME |
FISH_TYPE을 공통으로 갖고 있어서, 이걸 기준으로 연결할 수 있다.
FISH_TYPE 기준으로 INNER JOIN을 사용하였다.
FISH_NAME은 FISH_NAME_INFO에, ID와 LENGTH는 FISH_INFO에 있다.
"종류별로 가장 큰 물고기"를 찾으려면 먼저 종류별 최대 길이를 구해야 한다. 서브쿼리로 GROUP BY FISH_TYPE을 사용해 종류별 MAX(LENGTH)를 먼저 집계하였다.
SELECT fi.FISH_TYPE, MAX(fi.LENGTH)
FROM FISH_INFO fi
GROUP BY fi.FISH_TYPE
-- 풀어 쓰면
WHERE FISH_TYPE = 서브쿼리의 FISH_TYPE
AND LENGTH = 서브쿼리의 MAX_LENGTH
-- 압축하면
WHERE (FISH_TYPE, LENGTH) IN (서브쿼리)
(FISH_TYPE=1, LENGTH=70.5) → 서브쿼리에 있음 ✅ → 포함 (대어)
(FISH_TYPE=1, LENGTH=50.0) → 서브쿼리에 없음 ❌ → 제외
ORDER BY 1은 첫 번째 SELECT 컬럼인 ID 기준 오름차순 정렬을 의미한다.
구체적으로 정리한 풀이 흐름:
FISH_TYPE 기준으로 두 테이블 INNER JOINMAX(LENGTH) 구하기WHERE (FISH_TYPE, LENGTH) IN (서브쿼리)로 대어만 필터ORDER BY 1로 ID 오름차순 정렬SELECT
FISH_INFO.ID,
FISH_NAME_INFO.FISH_NAME,
FISH_INFO.LENGTH
FROM FISH_INFO
INNER JOIN FISH_NAME_INFO
ON FISH_INFO.FISH_TYPE = FISH_NAME_INFO.FISH_TYPE
WHERE (FISH_INFO.FISH_TYPE, FISH_INFO.LENGTH) IN (
SELECT fi.FISH_TYPE, MAX(fi.LENGTH)
FROM FISH_INFO fi
GROUP BY fi.FISH_TYPE
)
ORDER BY 1