서로 다른 테이블 속 데이터를 동시에 조회하기 위해, 사용하는 SQL 문법이다. 원하는 데이터를 조인하기 위해서 기본키(PRIMARY KEY)와 외래키(FOREIGN KEY) 관계를 이용해야 한다.
예를 들어, 고객 정보와 주문 정보를 합쳐서 어떤 고객이 어떤 상품을 얼마나 구매했는지 알아보기 위해, 고객 정보의 PK 와 주문 정보의 FK를 JOIN해서 테이블을 연결할 수 있다.
표준 JOIN은 테이블 간의 조건을 FROM 절에서 명시적으로 정의할 수 있다.
이와 같은 표준 JOIN의 유형은 크게 네 가지로 나눌 수 있다.
이번 글에서는 각 JOIN의 개념과 활용 방법의 차이점에 대해 알아보고자 한다.
INNER JOIN은 두 테이블 간의 공통된 값이 있는 행들만 결합하는 교집합 JOIN 의미한다. 즉, 결합하려는 두 테이블에서 모두 일치하는 데이터만을 반환하게 되는데, 만약 두 테이블에서 일치하는 데이터가 없다면 결과는 빈 행을 반환한다는 특징이 있다.

-- 고객 테이블 (customers)
customer_id | customer_name
------------|-------------
1 | 홍길동
2 | 이순신
3 | 이영교
-- 주문 테이블 (orders)
order_id | customer_id | product
---------|-------------|--------
1001 | 1 | 노트북
1002 | 2 | 스마트폰
예를 들어, 고객 정보(customers )테이블과 주문 정보(orders) 테이블이 있다고 가정할 때, 두 테이블을 고객 ID를 기준으로 결합하려고 하면 다음과 같은 SQL 문법을 작성할 수 있다.
SELECT c.customer_name, o.product
FROM customers c
INNER JOIN orders o
ON c.customer_id = o.customer_id;
위 쿼리를 조회했을 때, 고객 테이블과 주문 테이블을 customer_id를 기준으로 연결하여 각 고객이 주문한 상품을 조회할 수 있다.
만약 결합하려는 테이블 중 하나에만 있는 데이터는 결과에서 제외된다는 특징을 가지고 있다.
customer_name | product
----------------|---------------
홍길동 | 노트북
이순신 | 스마트폰
OUTER JOIN은 두 테이블 간의 공통된 값이 있는 행들뿐만 아니라, 한쪽 테이블에는 존재하지만 다른 쪽 테이블에는 존재하지 않는 데이터도 함께 반환하는 합집합 JOIN을 의미한다. 즉, 결합하려는 두 테이블에 모두 일치하는 데이터를 반환하고, 만약 두 테이블에서 일치하는 데이터가 없다면 결과를 null 값을 추가하여 행을 반환한다는 특징이 있다.
OUTER JOIN은 크게 3가지로 나눌 수 있다.
사용하는 문법과 결과는 모두 비슷하기 때문에 LEFT JOIN을 대표 예시로 들어보게 되면, 아래와 같은 SQL 문법을 작성할 수 있다.
SELECT c.customer_name, o.product
FROM customers c
LEFT OUTER JOIN orders o
ON c.customer_id = o.customer_id;
위 쿼리를 조회했을 때, 고객 테이블의 모든 행을 반환하며, 왼쪽 테이블에서 일치하는 데이터가 없으면 NULL 로 채워 고객이 주문한 상품을 조회할 수 있다.
customer_name | product
----------------|---------------
홍길동 | 노트북
이순신 | 스마트폰
이영교 | NULL
CROSS JOIN은 두 테이블의 모든 가능한 조합을 조건 없이 반환하는 방법이다. 두 테이블의 행의 수가 각각 n 과 m 이라면, 결과 테이블은 n*m 개의 행을 가지게 된다.
SELECT c.customer_name, o.product
FROM customers c
CROSS JOIN orders o;
위 쿼리의 결과는 모든 고객과 모든 주문의 조합을 생성하게 된다.
customer_name | product
----------------|---------------
홍길동 | 노트북
홍길동 | 스마트폰
이순신 | 노트북
이순신 | 스마트폰
이영교 | 노트북
이영교 | 스마트폰
NATURAL JOIN은 서로 다른 두 테이블 간에 동일한 이름의 열을 기준으로 자동으로 결합하는 방법이다. 동일한 열 이름을 찾고, 그 열의 값이 일치하는 행들만을 결합한다.
예를 들어, 두 테이블에 모두 customer_id 열이 있다고 가정할 때, NATURAL JOIN을 사용하면 이 열을 기준으로 결합이 자동으로 이루어진다.
단, 이를 위해 컬럼명과 데이터 유형이 모두 동일해야 하는 제약 조건이 있다는 것을 명심해야 한다. 또한, 동일한 열 이름이 여러 개 있을 경우 예상치 못한 결과를 초래할 수 있다는 것도 확인해야 한다.
SELECT customer_name, product
FROM customers
NATURAL JOIN orders;
위 쿼리를 보면, 동일한 열 이름을 사용하기 때문에, 명시적으로 ON 절이 필요 없다는 것을 확인할 수 있다.
다양한 JOIN 방법은 여러 개의 테이블을 한번에 조회할 때 사용된다는 점에서 공통되지만, 사용 목적과 결과는 서로 다르다.
적절한 JOIN 방법을 선택함으로써 원하는 데이터를 효과적으로 조회할 수 있다. 여러 가지 방법을 사용해보며, 필요한 상황에 맞게 사용하는 습관을 들여야겠다.