※TMI
데이터 엔지니어링을 하기 위해서는, Claude가 먼저 window function이 중요하다고 하여, window function 개념 및 셀프 조인 개념 및 왼쪽,오른쪽,완전 외부 조인 개념을 한번 리뷰하고 문제풀이를 진행하였다.
각각의 개념들은 내 '네이버 BOX' -> '개인 CS 공부 폴더' -> '데이터베이스' -> '[2025.10.30] 윈도우 함수(Window Function) 및 셀프 조인(self-join) 및 왼쪽,오른쪽,완전 조인(left,right,full outer join)까지 개념 정리.pdf' 참고!
이 글을 보시는 분들은, 해당 개념을 구글 웹 검색 및 Claude같은 AI에게 물어보면 잘 알려주니, 찾아서 공부해보시길 바랍니다.(갠적으로는 Claude 추천)


요약하자면 다음과 같다.
*INS 테이블(보호소에 들어온 동물 정보 테이블)
*OUTS 테이블(입양나간 동물 정보 테이블)
INS 테이블의 일부 정보 유실됨.
OUTS 테이블 기준으로, OUTS에는 있지만, INS에는 없는 동물들의 ANIMAL_ID 및 NAME 추출하기.
앞서 내가 말한,
'OUTS 테이블 기준으로' 이 생각을 했다면,
JOIN이 바로 떠오를 것이다.
나는 이왕 그냥 이쁘게(?) 하기 위해,
INS를 왼쪽에 두고, OUTS를 오른쪽에 두어,
RIGHT JOIN을 하기로 했다.
또한,
조인의 핵심은 '공통된 열을 기준'이므로,
양쪽 테이블에서 공통된 열이 많지만, 나는 그 중에서 PK로 구분될 수 있는 ANIMAL_ID로 삼았다.
->NAME은 일단 단일 속성으로 PK가 불가능할 확률도 높고(이름 중복 가능성), 무엇보다 NULL이 허용되므로 PASS.
이렇게 생각해서 코드를 작성해보았다.
정확한 코드 구성은 아직은 웹 검색해서 찾아봐야하므로(코드가 아직은 덜 익숙하다는 게 큰 함정...ㅠㅠ) 따로 검색해보았다.
'select 열 from 테이블1 (조인종류) 테이블2 on 조건'
이런 형식으로 작성되면 된다길래, 이대로 작성해보았다.
그래서 작성한 SQL 코드는 다음과 같다.
SELECT
ANIMAL_OUTS.ID,
ANIMAL_OUTS.NAME
FROM ANIMAL_INS RIGHT OUTER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID;
하지만, 이 코드를 천천히 해석해보면,
우리가 결과를 내야 할 '포함되지 X 동물들'이 아닌, '포함된 동물들'임을 알 수 있다.
즉, 이 결과에서 '여집합'을 해야 우리가 원하는 결과를 얻을 수 있는 것이다.
어떻게 여집합을 구현할까 고민을 하다가,
처음에는 오른쪽 (외부) 조인 말고, INNER JOIN(교집합)으로 접근해서 여집합을 적용해볼까?라는 생각을 했는데, 이 역시 여집합을 구현해야한다.
그럼 ON 조건에서 =이 아닌 !=로 구현하면 되지 않을까? 해서 CLAUDE에게 물어봤는데, 이런 답변을 주었다.



그렇다.
같다는(=) 기준이 아니라 같지 않음에 기준을 맞추므로,
그 행들을 추출하다보니 2개 행이 아닌 5개의 행을 추출해준다.
그럼 결국, 우리는 '여집합'을 어떻게 구현하느냐를 계속 고민해야하는 것이다.
CLAUDE가 힌트를 주었다.




즉 요약하자면,
내가 쓴 SQL 쿼리문에다가 조건 하나만 추가하면 되는 것이다.
오른쪽 조인을 해서 ANIMA_OUTS.ANIMAL_ID와 NAME을 추출하는데 + (조건 1개) 인 셈이다.
그래서 나는 이렇게 완성했다.
-- 코드를 입력하세요
SELECT
ANIMAL_OUTS.ANIMAL_ID,
ANIMAL_OUTS.NAME
FROM ANIMAL_INS RIGHT OUTER JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID WHERE ANIMAL_INS.ANIMAL_ID IS NULL;
오른쪽 조인을 해서 ANIMA_OUTS.ANIMAL_ID와 NAME을 추출하는데, ANIMAL_INS의 ANIMAL ID가 NULL인 애들을 추출하면 우리가 원하는 '여집합' 결과가 나오는 것이다.
이 SQL 코딩테스트 문제가 LEVEL 3인 이유는 아무래도 '여집합'을 구현할 수 있느냐 없느냐의 문제인 거 같아.
이렇게 해서 프로그래머스의 '없어진 기록 찾기' 문제를 풀어보았다.