본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (6) NATURAL JOIN

PostgreSQL

 

 

 

우선 이번 아티클에서는 NATURAL JOIN을 살펴보겠습니다. 사실, 이 NATURAL JOIN은 실제 사용 빈도가 꽤 낮기 때문에 잘 사용하지 않는 명령어입니다. 그런데 굳이 이 명령어에 대해서 살펴보는 이유는 무엇일까요? 이유는, 다름 아닌 "INNER JOIN"의 사용법을 한번 더 상기시키는 명령어이기 때문입니다. 

 

일단 우리가 이미 살펴보았던 INNER JOIN을 되새기고 오도록 하겠습니다. 

 

 

Chapter 2. JOIN을 이용한 데이터 조합 - (1) INNER JOIN

우선 당연하겠지만, JOIN이란 명령어 자체에 대한 정의가 이루어져야 JOIN과 관련된 내용을 배울 수 있을 것입니다. 기본적으로 SQL에서 JOIN은 [한 DB내의 두 개 이상의 테이블에서 레코드를 조합하

nozeroslope.tistory.com

 

간단하게 정리하자면, INNER JOIN을 통해 두 개(이상)의 테이블을 비교하고, ON에 해당하는 조건에 부합하는 ROW들을 출력하는 명령어입니다. 우리가 흔히 설명할 때 교집합을 이루는 데이터를 출력한다고 말하곤 합니다. 

 

NATURAL JOIN은 그럼 INNER JOIN과 어떤 관계가 있는 것일까요? 답은 간단합니다. "INNER JOIN을 자동화 시킨 명령어"입니다. 결과적으로는 INNER JOIN과 거의 같은 결과물을 내놓는 명령어인 것이죠. 

 

위에서 말씀드렸다시피, INNER JOIN 명령어를 작성할 때는 타겟이 되는 테이블을 FROM에 작성하고, 매칭할 테이블을 INNER JOIN 다음에 사용합니다. 그리고 두 개의 데이터를 비교할 조건을 ON에 작성합니다. 여기에 보조적으로 조건을 제한할 때 WHERE을 사용하기도 하죠. 

 

그런데 만약, NATURAL JOIN을 사용하게 된다면, 그냥 두 개의 테이블을 작성만 해주면 끝납니다(!?). 아래의 예시를 살펴볼까요? 

 

아래와 같은 두 개의 테이블이 있다고 가정하겠습니다. 우리가 앞선 아티클에 사용했던 테이블, EMPLOYEES3DEPARTMENTS2와 입니다.

 

EMPLOYEES3 테이블

 

DEPRATMENTS2 테이블

 

 

이제 이 두 테이블에 NATURAL JOIN을 아래와 같이 사용해 보겠습니다. 

 

 select *
   from employees3 e 
natural join departments2 d;

 

 

단 두개의 조건만을 작성했는데, 위와 같은 테이블이 완성되었습니다. 여기서 간단한 규칙을 말씀드리자면, 우선 두 테이블의 공통 칼럼 값인 DEPARTMENT_ID가 가장 앞으로 나오게 됩니다. 그리고 이 공통 DEPARTMENT_ID를 제외한 칼럼 값들이 EMPLOYEES3 테이블, 그다음 DEPARTMENTS2 테이블 순서대로 배치됩니다. 

 

만일 쿼리에서 두 테이블의 위치를 바꾸어준다면, DEPARTMENT_ID는 여전히 가장 앞에 나오고 그 다음 DEPARTMENT_NAME, EMPLOYEE_ID, EMPLOYEE_NAME 순서대로 출력이 됩니다. 

 

하지만 우리는 이런 경우, NATURAL JOIN을 사용하기 보다는 아래와 같은 INNER JOIN 쿼리를 사용하는 것을 더 권장합니다. 더 복잡하지만, 이것이 더 안정적인 쿼리입니다. 

 

select *
  from employees3 e 
 inner join departments2 d 
    on e.department_id = d.department_id;

 

 

왜일까요? 예를 들어서 여기서 두 개의 테이블은 DEPARTMENT_ID라는 값이 동일하다는 것을 전제로 하고 있습니다. 그런데 만약! 두 개의 테이블에 똑같은 이름의 UPDATED_TIME이라는 칼럼이 있다고 가정해 보겠습니다. 두 테이블의 칼럼 이름은 같지만, 값은 당연히 다릅니다.

 

그럼 DEPARTMENT_ID / UPDATED_TIME이라는 공통의 칼럼이 있기 때문에, NATURAL JOIN으로 두 테이블을 조인하게 되면 두 개의 공통 칼럼이 있는데 하나의 칼럼은 값이 다르기 때문에, 아무것도 공통된 조건이 없다고 판단하여 빈 테이블이 출력됩니다. 

 

이러한 예외적인 상황이 있기 때문에 NATURAL JOIN은 불안정하다고 판단하는 것이며, INNER JOIN을 사용하는 것입니다.