https://school.programmers.co.kr/learn/courses/30/lessons/293261
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
물고기 정보를 담은 FISH_INFO 테이블, 물고기 이름에 대한 정보를 담은 FISH_NAME_INFO 테이블을 이용하여 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해라. 문제에서 지정된 컬럼명을 별칭으로 사용하고, 물고기 ID를 기준으로 오름차순 정렬하라. (단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없음)
코드
-- 풀이1) 연관 서브쿼리 이용
SELECT FI.ID, FNI.FISH_NAME, FI.LENGTH
FROM FISH_INFO FI
INNER JOIN FISH_NAME_INFO FNI
USING (FISH_TYPE)
WHERE LENGTH = (SELECT MAX(LENGTH)
FROM FISH_INFO FI_SUB
WHERE FI.FISH_TYPE = FI_SUB.FISH_TYPE)
ORDER BY 1;
-- 풀이2) 다중컬럼 서브쿼리 이용
SELECT FI.ID, FNI.FISH_NAME, FI.LENGTH
FROM FISH_INFO FI
INNER JOIN FISH_NAME_INFO FNI
USING (FISH_TYPE)
WHERE (FI.FISH_TYPE, FI.LENGTH) IN (SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE)
ORDER BY 1;
풀이
풀이 1, 2번 모두 우선 두 테이블을 FISH_TYPE을 기준으로 JOIN 한다.
1번 풀이의 경우 연관 서브쿼리를 이용하여 메인쿼리에서 FISH_TYPE과 서브쿼리에서 FISH_TYPE이 동일한 행의 MAX(LENGTH)를 구해 메인쿼리에서 LENGTH와 비교한다.
2번 풀이의 경우 다중컬럼 서브쿼리를 이용하여 FISH_TYPE 별로 그룹화하여 FISH_TYPE과 MAX(LENGTH)를 반환하면 메인쿼리에서 비교한다. 이 때 WHERE 절의 연산자는 반드시 다중행 연산자인 IN을 사용하도록 한다.
'SQL > Coding Test' 카테고리의 다른 글
[프로그래머스] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.03.21 |
---|---|
[프로그래머스] 조건에 맞는 개발자 찾기 (0) | 2024.03.20 |
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.03.20 |
[프로그래머스] 가격대 별 상품 개수 구하기 (0) | 2024.03.19 |
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.03.15 |