PRACTICE/SQL

[MySQL] 3단계 1. 오랜 기간 보호한 동물(1)

j1ngerhead 2025. 1. 7. 23:58

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/59044

SELECT A.NAME, A.DATETIME 
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME 
LIMIT 3;

 

이 문제에서 LEFT JOIN 쓴 이유


이 문제에서는 보호소에 들어온 동물 중 아직 입양을 못 간 동물을 찾는 것이 목표다. 
LEFT JOIN을 사용하여, ANIMAL_INS 테이블의 
모든 데이터(입양 여부와 상관없이 보호소에 들어온 모든 동물)를 기준으로 하고 
ANIMAL_OUTS 테이블을 조인한다. 
이때, ANIMAL_OUTS에 해당 ANIMAL_ID가 없다면 NULL이 되므로, 입양 기록이 없는 동물임을 나타낸다. 
이를 조건으로 입양되지 않은 동물만 필터링할 수 있다.
JOIN을 썼을 때는 입양된 동물만 결과에 포함되므로, 아직 입양을 가지 않은 동물을 찾지 못한다.
LEFT JOIN을 써야 보호소에 들어왔지만 ANIMAL_OUTS에 기록이 없는 동물만 골라낼 수 있다.

 

JOIN과 LEFT JOIN의 차이

 

각 JOIN 방식은 어떤 데이터를 포함할지에 대한 조건을 설정하는 역할을 한다.

JOIN (INNER JOIN)

 

JOIN을 사용하면, 두 테이블에 모두 존재하는 데이터만 결과에 포함된다. 
즉, JOIN 조건에 맞는 데이터가 양쪽 테이블에 모두 있어야 해당 데이터가 결과에 포함된다. 
그래서 JOIN은 INNER JOIN과 동일하다고 생각할 수 있다.

LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 데이터를 포함하면서 오른쪽 테이블과의 매칭 여부를 판단한다. 
만약 오른쪽 테이블에 일치하는 데이터가 없다면, 
해당 컬럼들은 NULL로 채워져서 왼쪽 테이블의 데이터가 그대로 결과에 포함된다.

320x100