[프로그래머스 SQL] JOIN 정복: 유실된 기록 찾기와 데이터 시점 비교하기

이성진·2026년 3월 12일

프로그래머스 SQL

목록 보기
3/7

📌 JOIN: 두 테이블의 교집합과 차집합 다루기

SQL의 진정한 강력함은 여러 테이블을 하나로 엮어 새로운 통찰을 얻는 JOIN에서 나옵니다. 이번 포스팅에서는 데이터의 선후 관계를 비교하고, 유실된 데이터를 찾아내는 실전 JOIN 기술을 정리했습니다.


💡 1. 유실된 데이터 찾기 (OUTER JOIN)

📝 없어진 기록 찾기 (RIGHT JOIN + IS NULL)

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I
RIGHT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID;
  • 새로 배운 점: 1. 입양 게시판에는 정보가 있지만 보호소 입소 기록이 없는 데이터를 찾기 위해 RIGHT JOIN을 사용하여 ANIMAL_OUTS 테이블을 기준으로 합쳤습니다.
    1. 기준 테이블에는 존재하지만 조인 대상 테이블에 없는 데이터는 NULL로 채워진다는 점을 이용해, WHERE I.ANIMAL_ID IS NULL 조건을 걸어 유실된 데이터만 쏙 골라내는 법을 익혔습니다.

💡 2. 테이블 간 데이터 비교

📝 있었는데요 없었습니다 (JOIN + Comparison)

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME ASC;
  • 새로 배운 점: 1. 두 테이블에 공통으로 존재하는 데이터를 다룰 때는 일반적인 INNER JOIN을 사용합니다.
    1. JOIN된 상태에서는 서로 다른 테이블의 컬럼(입소일 vs 입양일)을 마치 한 테이블에 있는 것처럼 자유롭게 비교할 수 있음을 확인했습니다. '입소일(I.DATETIME)이 입양일(O.DATETIME)보다 더 빠른' 데이터를 찾아 논리적 오류를 점검하는 쿼리를 작성했습니다.

🚨 트러블 슈팅 및 회고

  • 정렬 기준의 명확화: 없어진 기록 찾기에서 ORDER BY I.ANIMAL_ID로 작성하면 I.ANIMAL_ID는 모두 NULL이기 때문에 정렬이 의미가 없어집니다. 기준 테이블인 O.ANIMAL_ID로 정렬해야 정확한 결과가 나옴을 인지하고 수정했습니다.
  • 테이블 Alias의 중요성: 두 테이블 모두 ANIMAL_ID, NAME, DATETIME이라는 동일한 컬럼명을 가지고 있어, I.O.라는 별칭을 붙여주지 않으면 Ambiguous column name 에러가 발생한다는 것을 다시금 체감했습니다.
profile
알고리즘과 cs지식 학습

0개의 댓글