INNER JOIN과 NATURAL JOIN의 차이점 분석

안녕하세요, surmin입니다.
많이들 INNER JOIN과 NATURAL JOIN에 대해 알고 계시겠지만, 헷갈리시는 분들을 위해 이 글을 준비했습니다.
참고해 주시면 감사하겠습니다.

INNER JOIN 란

INNER JOIN은 조인 조건을 만족하는 행들만 반환을 합니다
또한 DEFAULT 옵션이므로 생략이 가능하지만 , CROSS JOIN, OUTER JOIN과는 같이 사용할 수 없습니다.

SELECT *
FROM hr.employees e INNER JOIN hr.departments d
ON e.department_id=d.department_id;

#INNER 생략 가능 합니다.
SELECT *
FROM hr.employees e JOIN hr.departments d
ON e.department_id=d.department_id;

#JOIN 조건에 맞는 행수 출력
SELECT COUNT(*)
FROM hr.employees e JOIN hr.departments d
ON e.departmenst_id=d.department_id;

결과값 확인 시 JOIN 조건인 department_id에 맞는 행 수를 확인하였습니다.

NATURAL JOIN 란

INNER JOIN의 하위 개념으로 볼 수 있고, 두 테이블 간에 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행합니다.
추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없습니다.

SELECT department_id,manager_id
FROM hr.employees e NATURAL JOIN hr.departments d
ORDER BY department_id DESC;

SELECT *
FROM hr.employees e NATURAL JOIN hr.departments d
ORDER BY department_id DESC;

결과값을 확인해보니 총 32건이 나왔습니다. 처음에 보여드린 INNER JOIN과는 상당한 차이가 있음을 알 수 있습니다.
이제 왜 32건이 나왔는지 살펴보겠습니다.

FROM 절에서 employees와 departments 테이블을 참조하며, 각각의 컬럼을 확인해보겠습니다.

SELECT * FROM hr.departments;
SELECT * FROM hr.employees;

왼쪽 테이블은 departments이고, 오른쪽 테이블은 employees입니다. (employees 테이블은 행 수가 많아 일부분만 가져왔습니다.)

이제 INNER JOIN의 결과값을 다시 살펴보겠습니다

SELECT * FROM hr.departments;

SELECT *
FROM hr.employees e NATURAL JOIN hr.departments d
ORDER BY department_id DESC;

왼쪽 테이블은 departments이고, 오른쪽 테이블은 NATURAL JOIN의 결과값입니다.

결과값을 확인해보면, departments 테이블의 manager_id와 department_id 컬럼 값이 일치하는 행들만 NATURAL JOIN의 결과로 나타났음을 알 수 있습니다.
만약 SELECT 절에서 manager_id를 제외하고 나머지 컬럼 값들을 선택하여 NATURAL JOIN을 수행하더라도, 두 테이블에서 공통으로 존재하는 컬럼 값을 기준으로 비교하여 출력되기 때문에 manager_id를 제외한다고 해서 결과 값이 달라지지는 않습니다.

이제 실제로 그런지 검증해보겠습니다.

INNER JOIN을 통해 조건을 설정하고 출력되는 행의 개수를 확인해보겠습니다.

SELECT e.department_id, e.first_name, e.last_name, 
       e.manager_id as emp_manager, d.manager_id as dept_manager
FROM hr.employees e 
JOIN hr.departments d ON e.department_id = d.department_id 
                     AND e.manager_id = d.manager_id
ORDER BY 1 DESC;

확인해본 결과, 위와 동일하게 32행이 출력되는 것을 알 수 있었으며, NATURAL JOIN은 두 테이블에 같은 컬럼이 있을 경우 해당 컬럼 값을 기준으로 비교한다는 것을 검증을 통해 확인할 수 있었습니다.

이런 방식으로 검증을 진행하니 NATURAL JOIN이 무엇인지에 대해 좀 더 확실히 이해할 수 있는 시간이었습니다. 읽어주셔서 감사합니다. 🙂

위로 스크롤