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 조건의 조합을 활용하면 집합 개념의 차집합을 구현 할 수 있다는 점을 배웠다. 매우 유용하게 쓰일 수 있는 조건의 조합인거 같다.
'프로그래머스 SQL' 카테고리의 다른 글
| 15.프로그래머스 SQL Lv.4 (자동차 대여 기록 별 대여 금액 구하기) (0) | 2026.05.22 |
|---|---|
| 13.프로그래머스 SQL Lv.3 (부서별 평균 연봉 조회하기) (0) | 2026.05.19 |
| 12.프로그래머스 SQL Lv.3 (즐겨찾기가 가장 많은 식당 정보 출력하기) (0) | 2026.05.19 |
| 11.프로그래머스 SQL Lv.3 (있었는데요 없었습니다) (0) | 2026.05.19 |
| 10.프로그래머스 SQL Lv.3 (업그레이드 할 수 없는 아이템 구하기) (0) | 2026.05.19 |