INNER JOIN과 OUTER JOIN은 서로 다른 테이블의 데이터를 연결할 때 어떤 데이터를 조회 결과에 포함할 것인지 결정하는 JOIN 방식입니다. INNER JOIN은 두 테이블의 연결 조건이 일치하는 데이터만 조회하는 반면, OUTER JOIN은 한쪽 테이블에 일치하는 데이터가 없어도 특정 테이블의 데이터를 결과에 포함할 수 있습니다. 따라서 JOIN을 사용할 때 원하는 결과에 따라 적절한 JOIN 방식을 선택해야 합니다.

INNER JOIN이란 무엇인가

INNER JOIN은 두 테이블에서 JOIN 조건이 일치하는 행만 결과에 포함하는 방식입니다. 가장 기본적인 JOIN 형태이며, 일반적으로 관련 데이터가 양쪽 테이블에 모두 존재하는 경우 사용합니다.

예를 들어 회원 테이블과 주문 테이블이 다음과 같이 구성되어 있다고 가정하겠습니다.

member
id | name
1  | 김철수
2  | 이영희
3  | 박민수

orders
id  | member_id | price
101 | 1         | 50000
102 | 2         | 30000

회원 ID가 1인 김철수와 ID가 2인 이영희는 주문 데이터가 존재하지만, ID가 3인 박민수는 주문 데이터가 없습니다.

이때 INNER JOIN을 사용하면 다음과 같이 작성할 수 있습니다.

SELECT m.name, o.price
FROM member AS m
INNER JOIN orders AS o
ON m.id = o.member_id;

결과는 다음과 같습니다.

name   | price
김철수  | 50000
이영희  | 30000

박민수는 회원 테이블에는 존재하지만 주문 테이블에 연결되는 데이터가 없기 때문에 결과에서 제외됩니다.

INNER JOIN의 핵심은 두 테이블의 연결 조건을 만족하는 데이터만 조회한다는 것입니다.

실제로 SQL에서는 JOIN만 작성해도 일반적으로 INNER JOIN과 같은 의미로 사용할 수 있습니다.

SELECT m.name, o.price
FROM member AS m
JOIN orders AS o
ON m.id = o.member_id;

따라서 JOIN과 INNER JOIN은 같은 의미로 사용되는 경우가 많습니다.

OUTER JOIN이란 무엇인가

OUTER JOIN은 JOIN 조건이 일치하지 않는 데이터도 특정 테이블을 기준으로 결과에 포함할 수 있는 JOIN 방식입니다.

대표적으로 LEFT JOIN과 RIGHT JOIN이 있으며, SQL 표준에는 두 테이블의 모든 데이터를 포함하는 FULL OUTER JOIN도 있습니다.

가장 많이 사용되는 방식은 LEFT JOIN입니다.

SELECT m.name, o.price
FROM member AS m
LEFT JOIN orders AS o
ON m.id = o.member_id;

앞서 사용한 데이터에서 LEFT JOIN을 실행하면 다음과 같은 결과가 나올 수 있습니다.

name   | price
김철수  | 50000
이영희  | 30000
박민수  | NULL

박민수는 주문 데이터가 없지만 회원 테이블을 기준으로 조회했기 때문에 결과에 포함됩니다. 주문 정보가 존재하지 않는 부분은 NULL로 표시됩니다.

이것이 INNER JOIN과 LEFT JOIN의 중요한 차이입니다.

INNER JOIN은 양쪽에 모두 일치하는 데이터가 있어야 하지만, LEFT JOIN은 왼쪽 테이블의 데이터를 모두 유지하면서 오른쪽 테이블에서 일치하는 데이터를 연결합니다.

LEFT JOIN과 RIGHT JOIN

LEFT JOIN은 왼쪽에 작성한 테이블의 데이터를 모두 결과에 포함합니다.

SELECT m.name, o.price
FROM member AS m
LEFT JOIN orders AS o
ON m.id = o.member_id;

여기에서는 member가 왼쪽 테이블이므로 모든 회원이 결과에 포함됩니다. 주문이 없는 회원도 결과에서 제외되지 않습니다.

반대로 RIGHT JOIN은 오른쪽에 작성한 테이블의 데이터를 모두 결과에 포함합니다.

SELECT m.name, o.price
FROM member AS m
RIGHT JOIN orders AS o
ON m.id = o.member_id;

이 경우에는 orders 테이블의 모든 주문이 결과에 포함됩니다. 회원 테이블에서 연결되는 데이터를 찾지 못하더라도 주문 데이터를 기준으로 결과가 만들어질 수 있습니다.

다만 실제 개발에서는 RIGHT JOIN 대신 테이블의 순서를 변경하여 LEFT JOIN으로 작성하는 경우도 많습니다.

예를 들어 다음 두 쿼리는 결과의 기준을 동일하게 만들 수 있습니다.

SELECT m.name, o.price
FROM member AS m
RIGHT JOIN orders AS o
ON m.id = o.member_id;
SELECT m.name, o.price
FROM orders AS o
LEFT JOIN member AS m
ON m.id = o.member_id;

따라서 LEFT JOIN을 중심으로 이해하면 다른 OUTER JOIN 방식도 이해하기 쉬워집니다.

INNER JOIN과 OUTER JOIN의 차이

INNER JOIN과 OUTER JOIN의 가장 큰 차이는 JOIN 조건에 일치하지 않는 데이터를 어떻게 처리하는가입니다.

예를 들어 회원 중 주문을 한 사람만 조회하려면 INNER JOIN을 사용할 수 있습니다.

SELECT m.name, o.price
FROM member AS m
INNER JOIN orders AS o
ON m.id = o.member_id;

이 경우 주문이 없는 회원은 결과에서 제외됩니다.

반면 모든 회원을 조회하면서 주문을 하지 않은 회원도 함께 확인하려면 LEFT JOIN을 사용할 수 있습니다.

SELECT m.name, o.price
FROM member AS m
LEFT JOIN orders AS o
ON m.id = o.member_id;

이 경우 주문이 없는 회원도 결과에 포함되고 주문 정보가 없는 컬럼에는 NULL이 표시됩니다.

따라서 두 JOIN은 서로 우열이 있는 것이 아니라 조회 목적에 따라 사용하는 방식이 다릅니다.

또한 LEFT JOIN을 사용하면 특정 데이터가 존재하지 않는 대상을 찾는 것도 가능합니다. 예를 들어 주문 기록이 없는 회원을 찾으려면 다음과 같이 작성할 수 있습니다.

SELECT m.name
FROM member AS m
LEFT JOIN orders AS o
ON m.id = o.member_id
WHERE o.id IS NULL;

회원 테이블을 기준으로 모든 회원을 가져온 뒤 주문 데이터가 연결되지 않은 행만 찾는 방식입니다.

이처럼 JOIN은 단순히 두 테이블을 연결하는 기능을 넘어, 서로 다른 테이블 사이의 데이터 존재 여부를 확인하는 데에도 활용할 수 있습니다.

정리하면 INNER JOIN은 양쪽 테이블에서 JOIN 조건이 일치하는 데이터만 조회합니다. LEFT JOIN은 왼쪽 테이블의 데이터를 모두 유지하면서 오른쪽 테이블의 일치하는 데이터를 연결합니다. RIGHT JOIN은 반대로 오른쪽 테이블의 데이터를 모두 유지합니다.

JOIN을 사용할 때는 단순히 문법을 외우는 것보다 어느 테이블의 데이터를 반드시 유지해야 하는지를 먼저 생각하는 것이 중요합니다. 모든 회원을 조회해야 한다면 회원 테이블을 기준으로 LEFT JOIN을 사용하고, 주문과 회원 정보가 모두 존재하는 데이터만 필요하다면 INNER JOIN을 사용할 수 있습니다.

결국 INNER JOIN과 OUTER JOIN의 차이는 JOIN 조건에 맞지 않는 데이터를 결과에 포함할 것인지 여부에 있습니다. INNER JOIN은 일치하는 데이터만 가져오고, OUTER JOIN은 특정 기준 테이블의 데이터를 유지하면서 일치하지 않는 데이터도 결과에 포함할 수 있습니다. 이러한 JOIN 방식의 차이를 이해하면 여러 테이블에 분산된 데이터를 원하는 형태로 조회할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

글쓴이

rjsan46@koreabites.com

관련 게시물

복합 인덱스란 무엇인가

복합 인덱스는 데이터베이스에서 두 개 이상의 컬럼을 하나의 인덱스로 묶어 사용하는 방식입니다. 하나의 컬럼만 검색하는 단일 인덱스와 달리 여러 컬럼을 함께 조건으로...

모두 읽어보기

인덱스가 빠른 이유

인덱스가 빠른 이유는 데이터베이스가 검색할 때 테이블의 모든 데이터를 처음부터 끝까지 확인하지 않고, 별도로 구성된 검색 구조를 이용하여 필요한 데이터의 위치를 빠르게...

모두 읽어보기

인덱스란 무엇인가

인덱스는 데이터베이스에서 원하는 데이터를 빠르게 찾기 위해 사용하는 자료 구조입니다. 데이터가 많아질수록 모든 데이터를 하나씩 확인하는 방식은 검색 시간이 증가하기 때문에 인덱스를...

모두 읽어보기

서브쿼리란 무엇인가

서브쿼리는 SQL 문 안에 다른 SQL 문을 포함하여 사용하는 쿼리입니다. 하나의 SQL 문에서 필요한 데이터를 먼저 조회한 다음 그 결과를 바깥쪽 쿼리에서...

모두 읽어보기

JOIN이란 무엇인가

JOIN은 SQL에서 서로 다른 테이블에 저장된 데이터를 연결하여 하나의 조회 결과로 가져올 때 사용하는 구문입니다. 관계형 데이터베이스에서는 하나의 테이블에 모든 데이터를 저장하기보다...

모두 읽어보기

DELETE란 무엇인가

DELETE는 SQL에서 테이블에 저장된 기존 데이터를 삭제할 때 사용하는 구문입니다. INSERT가 새로운 데이터를 추가하고 UPDATE가 기존 데이터를 수정한다면 DELETE는 더 이상 필요하지...

모두 읽어보기