우당탕탕 개발일지
[SQL] 프로그래머스 SUM, MAX, MIN : 물고기 종류 별 대어 찾기 (level 3) 본문
💡문제 링크
💡SQL 코드 설계
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.
1. SELECT문에 ID, FISH_NAME, LENGTH 넣기 **이후에 서브쿼리 쓸 거니까 여기서 MAX(LENGTH) 안 쓴다!!**
2. FISH_TYPE을 키값으로 해서 FISH_INFO와 FISH_NAME_INFO 테이블을 JOIN한다.
3. WHERE 절에 서브쿼리를 사용해서 "FISH_TYPE을 기준으로 그룹을 나누었을 때 그룹에서 LENGTH값이 가장 큰 행"을 가져온다.
4. ID를 기준으로 오름차순 정렬
💡SQL 코드
-- 코드를 작성해주세요
SELECT F.ID, N.FISH_NAME, F.LENGTH AS LENGTH
FROM FISH_INFO F
JOIN FISH_NAME_INFO N
ON F.FISH_TYPE LIKE N.FISH_TYPE
WHERE (F.FISH_TYPE, F.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE
)
ORDER BY F.ID
💡기억할 내용
처음에 이렇게 코드를 짰더니 아래와 같은 오류 메세지가 떴다.
F.ID가 GROUP BY절에 종속되어있지 않기 때문에, F.ID열을 다른 조건절로 구해야하는 상황이었다.
그래서 결국 서브쿼리를 사용해서 문제를 풀었다.
SELECT문에는 MAX(F.LENGTH)를 없애고,
WHERE절에 "LENGTH가 최댓값을 가지는 행만 가져오기"라는 조건을 넣었다.
다중 컬럼 서브쿼리(Multi Column Subquery)
서브쿼리의 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교된다.
WHERE (F.FISH_TYPE, F.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE
)
다중 행 서브쿼리(Multi Row Subquery)
다중 행 비교 연산자 IN, ALL, ANY, EXISTS과 함께 사용된다.
IN: 메인쿼리의 비교조건이 서브쿼리의 결과 중 하나만 동일하면 참
WHERE (F.FISH_TYPE, F.LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE
)
'SQL' 카테고리의 다른 글
[SQL] 프로그래머스 GROUP BY: 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (level 3) (0) | 2024.03.23 |
---|---|
[SQL] 프로그래머스 SUM, MAX, MIN : 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (level 1) (0) | 2024.03.23 |
[SQL] 프로그래머스 GROUP BY : 물고기별 잡은 수 구하기(level 2) (0) | 2024.03.17 |
[SQL] 프로그래머스 IS NULL : 잡은 물고기의 평균 길이 구하기 (level 1) (0) | 2024.03.17 |
[SQL] 프로그래머스 SELECT : 잔챙이 잡은 수 구하기 (level 1) (0) | 2024.03.15 |