- 0
- 331 단어
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 방식의 차이를 이해하면 여러 테이블에 분산된 데이터를 원하는 형태로 조회할 수 있습니다.