Posts [프로그래머스] 없어진 기록 찾기 (JOIN, LEFT OUTER JOIN)
Post
Cancel

[프로그래머스] 없어진 기록 찾기 (JOIN, LEFT OUTER JOIN)

[프로그래머스] 없어진 기록 찾기


ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블 두 개를 활용하여 쿼리문을 작성하는 문제입니다.

ANIMAL_OUTS 테이블에는 있는데, ANIMAL_INS 테이블에는 없는 동물들의 ID와 이름을 조회해야 합니다.


  • 등장하는 개념
    • JOIN, LEFT OUTER JOIN

JOIN 의 활용

JOIN은 두 테이블의 데이터를 일정한 조건에 의해 연결하여 마치 하나의 테이블처럼 만드는 것으로 볼 수 있습니다.

주로 많이 쓰이는 것으로 INNER JOIN과 LEFT OUTER JOIN을 들 수 있습니다.


LEFT OUTER JOIN

  • 위 그림처럼 두 테이블이 존재한다고 가정해 보겠습니다.

  • 두 테이블의 JOB 이 같은 것을 기준으로 LEFT OUTER JOIN을 진행합니다.
  • LEFT OUTER JOIN은 왼쪽에 오는 테이블을 기준으로, 오른쪽에 오는 테이블과 비교하여 조건에 맞는 값이 있으면 JOIN하여 가져오고, 값이 없으면 null 값을 표시합니다.
  • 즉 LEFT OUTER JOIN은 이처럼 JOIN 문을 수행할 때, 왼쪽에 있는 데이터는 무조건 가져오며, 오른쪽에 오는 테이블과 JOIN을 수행하여 조건에 맞는 데이터가 없을 시 null 로 표시하게 됩니다.
  • 위의 그림에 나온 결과표를 참고해 주세요.
    • TABLE_ONE에 있는 aaaJOB 이 student 입니다.
    • TABLE_TWO 에 JOB이 student 인 값들과 LEFT OUTER JOIN이 수행되어 모두 연결이 됩니다.
    • 하지만 TABLE_ONEdddJOB이 athlete 이지만, TABLE_TWO 에는 JOB이 athlete 인 데이터가 없습니다.
    • 그러므로 LEFT OUTER JOIN을 수행하면, 왼쪽 테이블의 데이터인 ddd는 결과에도 무조건 표시되지만, 오른쪽 테이블에 같이 연결할 데이터가 없으므로 NULL 값을 표시하게 됩니다.

LEFT OUTER JOIN을 활용하여 문제를 풀 수 있습니다.

문제에서는, 입양을 간 기록(ANIMAL_OUTS)있지만, 들어온 기록(ANIMAL_INS) 은 없는 데이터를 조회해야 합니다.

LEFT OUTER JOIN을 어떻게 사용하면 될까요?

  • 입양을 간 기록은 존재한다고 하였으므로, JOIN 결과에는 ANIMAL_OUTS 데이터가 무조건 나오게 해야 할 것입니다. 따라서 JOIN 문 왼쪽에 ANIMAL_OUTS 테이블이 와야 할 것입니다.

  • ANIMAL_OUTS 와 ANIMAL_INS 를 ANIMAL_ID가 같은 것을 기준으로 LEFT OUTER JOIN 하면,

    • ANIMAL_OUTS 테이블에 존재하는 ANIMAL_ID와, 그 ANIMAL_ID와 같은 ANIMAL_INS 테이블의 데이터가 옆에 같이 연결될 것입니다.
    • 그러나 ANIMAL_ID가 같은 값이 ANIMAL_INS 테이블에 존재하지 않는다면, NULL 값으로 연결될 것입니다.
    • 이를 통해, ANIMAL_OUTS 에는 있지만 ANIMAL_INS에는 없는 ANIMAL_ID 의 값을 조회할 수 있게 됩니다.
1
2
3
4
5
6
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS
LEFT OUTER JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID is NULL
ORDER BY OUTS.ANIMAL_ID
  • 오른쪽에 연결될 INS의 자료가 null 인 것으로부터(where 조건 참조) 찾을 수 있습니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges