데이터 분석

흐름을 읽고
인사이트를 만든다.

14.프로그래머스 SQL Lv.3 (없어진 기록 찾기)

2026. 5. 19. 12:53프로그래머스 SQL

문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

 

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

문제

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

 

문제 파악

1. 입양을 간 기록(ANIMAL_OUTS)은 무조건 존재하므로, ANIMAL_OUTS를 왼쪽에 두고 LEFT JOIN 한다.

2. 양쪽의 테이블의 동물 ID가 보호소 들어온 테이블(ANIMAL_INS)에 없다면, 두 테이블을 합쳤을 때 보호소 테이블의 컬럼들은 전부 NULL로 채워진다.

3. WHERE AI.ANIMAL_ID IS NULL 조건을 주어 유실된 데이터만 필터링.

4. 동물의 ID 순으로 오름차순 정렬

 

해결 과정

1. SELECT AO.ANIMAL_ID, AO.NAME

  • 결과에 나올 동물의 ID 와 이름 선택
  • 보호소 테이블(AI)의 데이터는 비어있는 상태이므로, AO 의 컬럼을 지정

2. FROM ANIMAL_OUTS AO LEFT JOIN ANIMAL_INS AI ON AO.ANIMAL_ID = AI.ANIMAL_ID

  • LEFT JOIN: 왼쪽 테이블(ANIMAL_OUTS)의 모든 데이터에서, 고유 번호(ANIMAL_ID)가 일치하는 데이터를 오른쪽 테이블(ANIMAL_INS)에서 찾아와 가로로 합친다.
  • 이때 매칭되는 데이터가 오른쪽 테이블에 없으면, 오른쪽 테이블의 컬럼 공간은  NULL로 채워지게 된다.

3. WHERE AI.ANIMAL_ID IS NULL

 

  • 조인한 결과 중에서 보호소 입소 기록 테이블(AI)의 ID 자리가 NULL로 비어있는 데이터만 필터링.

4. ORDER BY AO.ANIMAL_ID ASC;

  • 동물의 아이디 알파벳/숫자 순서대로 오름차순 정렬

답변

SELECT AO.ANIMAL_ID, AO.NAME
FROM ANIMAL_OUTS AO
LEFT JOIN ANIMAL_INS AI ON AO.ANIMAL_ID = AI.ANIMAL_ID
WHERE AI.ANIMAL_ID IS NULL
ORDER BY AO.ANIMAL_ID ASC;

 

 

LEFT JOIN과 IS NULL 조건의 조합을 활용하면 집합 개념의 차집합을 구현 할 수 있다는 점을 배웠다. 매우 유용하게 쓰일 수 있는 조건의 조합인거 같다.