https://school.programmers.co.kr/learn/courses/30/lessons/293261
1. 서론
max 함수를 활용하는 문제... 지만 서브쿼리도 사용해야 함!
레벨 3이라고 했는데 그렇게 어렵진 않다... (사실 조금 복잡하긴 해요)
2. 문제 풀이
FISH_INFO: ID, FISH_TYPE, LENGTH, TIME
(잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜)
FISH_NAME_INFO:
FISH_TYPE, FISH_NAME
(물고기의 종류(숫자), 물고기의 이름(문자))
Q. 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해 주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해 주세요.
물고기 종류별로 가장 큰 => group by를 사용해야 한다. 그래서 서브쿼리를 사용했다.
왜냐하면 select 해야 하는 것은 id, fish_name, length인데 group by를 사용하려면 select 문에 있는 것을 전부 group by 절에 적어야 한다. 하지만 그러면 group by 하는 의미가 사라짐...
그래서 서브쿼리에서 group by를 통해서 물고기 종류별로 가장 큰 length를 구하고, 이 정보를 토대로 메인 쿼리에서 같은 값을 출력하면 된다.
3. 코드 설명
select f.id, i.fish_name, x.length
from fish_info f, fish_name_info i,
(select f.fish_type as type, max(f.length) as length
from fish_info f
group by f.fish_type) x
where f.fish_type = x.type // 서브와 메인 쿼리의 타입이 일치
and f.fish_type = i.fish_type // 두 테이블의 fk
and x.length = f.length // id출력을 위해 어떤 물고기의 length인지 맞춰주는 역할
order by f.id
서브쿼리에서 fish_type과 length 값을 가지고
메인쿼리에서 그 값이 일치하도록 where절에서 조건을 붙여줬다.
그런데 그렇게 썩 잘 만든 문제는 아닌 게 조건에 오름차순 정렬을 해달라고 했는데 order by를 깜빡하고 안 넣었는데도 맞았다... ㅋㅋ
사실 max 카테고리의 문제인데 지금 보니까 group by 카테고리 문제라고 해도 될 듯...ㅋㅋㅋㅋ
'SQL' 카테고리의 다른 글
[MySQL] 대여 기록이 존재하는 자동차 리스트 구하기 (0) | 2024.07.12 |
---|---|
[MySQL] 프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2023.01.17 |
[MySQL] 프로그래머스 카테고리 별 도서 판매량 집계하기(+Oracle) (0) | 2023.01.17 |
[MySQL] 프로그래머스 카테고리 별 상품 개수 구하기 (0) | 2023.01.13 |
[MySQL] 프로그래머스 가격대 별 상품 개수 구하기 (0) | 2023.01.12 |