본문 바로가기
SEO's Study/프로페셔널한 이야기

프로그래머스 코딩테스트 :: 없어진 기록찾기(MySQL)

by 신SEO세오 2020. 9. 20.
반응형

[접속 사이트] 프로그래머스 programmers.co.kr

[문제] ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블이고, ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸      

          정보를 담은 테이블이다. 천재지변으로 보호소에 들어온 기록이 유실되었다. 이때 유실된 동물의 ID와 이름을 SQL문으로 작성하시오.

          단, ID 기준으로 정렬되어야 한다.

 

 

그동안 하나의 테이블로 정보를 추출해왔다면, 이번 문제부터는 2개의 테이블을 연관지어 비교해야만 결과 값을 구할 수 있습니다.

이렇게 두 개의 테이블을 연관짓는 것을 'JOIN 한다'라고 표현하는데, 이 JOIN의 종류부터 공부해야할 필요가 있습니다.

 

 

JOIN의 종류는 아주 다양하게 있지만, 여기서는 INNER JOIN, OUTER JOIN(LEFT, RIGHT)에 대해서만 알아볼게요. 

 

 

INNER JOIN은 두 개의 테이블에 모두 속하는 교집합에 대한 결과를 찾아내는 것이고, 

OUTER JOIN은 교집합에 대해 포함된 결과와 LEFT, RIGHT 중 하나의 테이블은 무조건 결과에 포함시키는 쿼리에요. 

예를 들면, TABLEA  LEFT JOIN TABLEB일 경우 TABLEA의 결과는 모두 노출하고 A와 교집합이 있는 B만 추가로 추출한다는 뜻이에요. 

 

이 외에도 많은 JOIN 방법이 있지만 이번 문제에 해당되지 않기 때문에 추후 다뤄볼거구요. 

오늘은 입양 보낸기록은 있지만, 보호소에 들어온 기록이 없는 데이터 추출을 위해 OUTER JOIN을 사용할 예정입니다 :) 

 

 

[나의 풀이]

동물을 입양 보낸 기록은 유실되지 않았기 때문에 ANIMAL_OUTS 테이블을 필수 테이블로 사용하겠습니다.

테이블의 위치를 어디에 두냐에 따라 LEFT, RIGHT가 정해지겠죠?

SELECT a.ANIMAL_ID, a.NAME 
from ANIMAL_OUTS a LEFT JOIN ANIMAL_INS b 
-- 왼쪽에 있는 ANIMAL_OUTS가 필수 테이블이므로 LEFT JOIN을 사용 
on a.ANIMAL_ID = b.ANIMAL_ID
-- ANIMAL_ID를 기준으로 비교함
where b.ANIMAL_ID IS NULL

JOIN 이후에 나오는 on a.ANIMAL_ID = b.ANIMAL_ID는 a, b테이블에서 비교할 key값을 ANIMAL_ID로 비교하는 조건을 달아줬어요.

단순 비교 뿐만아니라 없는 데이터를 추출하기 위해 b.ANIMAL_ID가 없는 값을 찾아야 겠죠! 

 

 

[실행 결과]

 



반응형

댓글