[프로그래머스] Lv.3 물고기 종류 별 대어 찾기 (JOIN, IN)

[프로그래머스] Lv.3 물고기 종류 별 대어 찾기 (JOIN, IN)
muaga's avatar
May 27, 2024
[프로그래머스] Lv.3 물고기 종류 별 대어 찾기 (JOIN, IN)
 
notion image
notion image
notion image
notion image
 


◽ JOIN, IN

SELECT I.ID, N.FISH_NAME, I.LENGTH FROM FISH_INFO AS I JOIN FISH_NAME_INFO AS N ON I.FISH_TYPE = N.FISH_TYPE WHERE I.LENGTH IN ( SELECT MAX(LENGTH) FROM FISH_INFO ➡️ WHERE FISH_TYPE = I.FISH_TYPE GROUP BY FISH_TYPE ) ORDER BY I.ID;
 

풀이


❔ JOIN + IN을 사용할 경우, 내부의 조건에 따른 결과 차이

첫 번째 쿼리
SELECT I.ID, N.FISH_NAME, I.LENGTH FROM FISH_NAME_INFO AS N JOIN FISH_INFO AS I ON N.FISH_TYPE = I.FISH_TYPE WHERE I.LENGTH IN ( SELECT MAX(LENGTH) FROM FISH_INFO GROUP BY FISH_TYPE ) ORDER BY I.ID;
 
◽ 두 번째 쿼리
SELECT I.ID, N.FISH_NAME, I.LENGTH FROM FISH_INFO AS I JOIN FISH_NAME_INFO AS N ON I.FISH_TYPE = N.FISH_TYPE WHERE I.LENGTH IN ( SELECT MAX(LENGTH) FROM FISH_INFO ⭐ WHERE FISH_TYPE = I.FISH_TYPE GROUP BY FISH_TYPE ) ORDER BY I.ID;
 
결과 차이
두 쿼리의 결과가 다른 이유는 서브쿼리의 조건과 상관 여부 때문이다.
  • 첫 번째 쿼리 :
SELECT MAX(LENGTH) FROM FISH_INFO GROUP BY FISH_TYPE
서브쿼리는 독립적으로 실행되어 ( ) 속에 맞는 결과를 반환한다. 각 ‘FISH_TYPE’의 최대 길이를 가진 행을 반환하여, 외부 쿼리(JOIN)는 이 행을 ‘I.LENGTH’ 와 비교하여 조건에 맞는 행을 선택한다.
➡️ 모든 FISH_TYPE의 최대 길이를 단일 집합으로 비교해서 선택하는 방식이다.
 
  • 두 번째 쿼리 :
SELECT MAX(LENGTH) FROM FISH_INFO ⭐ WHERE FISH_TYPE = I.FISH_TYPE GROUP BY FISH_TYPE
서브 쿼리가 외부 쿼리의 ‘I.FISH_TYPE’을 참조한다. ’I.FISH_TYPE’ 값에 대해 실행되어 해당 'FISH_TYPE'의 최대 길이를 가진 행을 반환한다. 이렇게 하면 각 ‘I.FISH_TYPE’ 별로 최대 길이를 가진 행을 확실히 선택한다.
➡️ 각 FISH_TYPE에 대해 개별적으로 최대 길이를 비교하여 선택하는 방식이다.
 
두 쿼리의 주요 차이는 서브쿼리가 외부 쿼리와 상관 관계가 있는 지 여부에 있다. 두 번째 쿼리가 의도한 대로 각 FISH_TYPE의 최대 길이를 가진 행을 정확히 선택하는 방식으로 보다 구체적이고 정확한 결과를 제공한다.
 
Share article

muaga's Hub