본문 바로가기
Database/DB이론

[SQL] Join(조인)의 종류와 특징

by Ratataca 2022. 3. 9.

1. INNER JOIN

앞의 INNER은 생략 할 수 있기 때문에 우리가 가장 많이 사용하는 조인문이다. INNER JOIN의 포인트는 바로 "두 테이블의 관계가 있는 것만 조회"가 가능하다는 것이다. 한 테이블에만 있는 정보에 대해서는 두 테이블을 합하지 않는다. 즉, 한 쪽이 NULL인 JOIN이 이루어질 때 해당 데이터는 무시한다는 것이다.

INNER JOIN 또는 JOIN(INNER 생략 가능)의 상황의 예시를 살펴보자. 프로그래머스의 있었는데요 없었습니다 문제가 있다.

문제 상황은 아래의 게시글를 참조하면 된다.

https://ratataca.tistory.com/105

 

[프로그래머스] JOIN > 있었는데요 없었습니다.

문제 설명 조건 ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SE..

ratataca.tistory.com

 

이 문제의 정답은 다음과 같다.

# 보호 시작일.DATETIME > 입양일.DATETIME
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS AS INS
INNER JOIN ANIMAL_OUTS AS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME;

해당 문제를 풀기 위해서 INNER JOIN을 사용한 이유는 문제 속에서 찾을 수 있다.

문제)  일부 데이터가 유실되었습니다입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하라.

우린 ANIMAL_OUTS 테이블에 데이터가 있는 동물들과 동물 보호소에 들어온 동물의 정보가 담긴 ANIMAL_INS 테이블의 날짜를 비교해야한다. 이때 입양도 안간 동물들에 대해서 비교하는 것은 무의미 하다는 것을 알 수 있다.

따라서 우리는 두 테이블에 데이터가 모두 존재하는 것만 JOIN하는 INNER JOIN를 사용하는 것이다.

 

 

2. OUTER JOIN

OUTER JOIN은 INNER JOIN과 다르게 명시적으로 작성해야 사용할 수 있다. OUTER JOIN의 종류는 다음과 같다.

  1. LEFT OUTER JOIN
  2. RIGHT OUTER JOIN
  3. FULL OUTER JOIN(여기선 설명하지 않음)

LEFT OUTER JOIN인과 RIGHT OUTER JOIN은 명시적으로 어떤 방향의 테이블을 기준으로 할 것인지 작성해줘야한다. 왼쪽 테이블 기준? 또는 오른쪽 테이블 기준. 이것은 상황에 따라 적절하게 사용하면 되지만, 실무에서는 LEFT OUTER JOIN이 대중적으로 사용한다. OUTER은 정해준 기준의 방향의 테이블을 기준으로 연관된 데이터가 있으면 데이터로 표현하고 없다면 NULL을 통해서 표현한다.

 

LEFT OUTER JOIN의 상황의 예시를 살펴보자. 프로그래머스의 오랜 기간 보호환 동물(1) 문제가 있다. 

문제 상황은 아래의 게시글를 참조하면 된다.

https://ratataca.tistory.com/102

 

[프로그래머스] JOIN > 오랜 기간 보호한 동물(1)

문제 설명 조건 ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SE..

ratataca.tistory.com

 

 

이 문제의 정답은 다음과 같다.

SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS
LEFT OUTER JOIN ANIMAL_OUTS AS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME
LIMIT 3;

 

여기서 LEFT OUTER JOIN을 사용한 이유는 문제 속에 힌트가 있다. 

문제)  아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

우린 동물 보호소에 들어온 동물의 정보가 담긴 ANIMAL_INS과 동물 보호소에서 입양 보낸 동물의 정보를 담은  ANIMAL_OUTS 사이에서 아직 입양을 못 간 동물을 찾아야한다.

이를 INNER JOIN으로 찾았다고 가정해보자. 어떻게 입양을 못 간 동물을 찾을 것인가? ANIMAL_INS에는 모든 동물이 있고 ANIMAL_OUTS에는 입양을 간 동물들이 있을 것이다. 여기서 입양을 못간 동물을 찾는 것은 INNER JOIN으로는 불가능하다. 따라서 ANIMAL_INS 테이블을 기준으로 OUTER JOIN으로 찾게 된다면 입양을 간 동물에 대해선 ANIMAL_OUTS 테이블의 정보가 있을 것이고 입양을 가지 못한 동물에 대해선 NULL값으로 데이터가 보일 것이다.

따라서 WHERE OUTS.ANIMAL_ID IS NULL 명령어를 통해 입양을 가지 못한 동물들에 데이터만 가져올 수 있게 된다.

 

댓글