본문 바로가기
카테고리 없음

SQL JOIN 함수 완전 정복: INNER, LEFT, RIGHT, FULL

by business27 2025. 7. 27.

SQL에서 데이터를 효과적으로 조회하기 위해 가장 많이 사용되는 문법 중 하나는 바로 JOIN입니다. JOIN은 여러 테이블 간의 관계를 정의하고, 이 관계를 기반으로 데이터를 결합하는 데 사용됩니다. 이번 글에서는 SQL의 다양한 JOIN 함수에 대해 설명하고, 각 JOIN 유형별로 예제를 들어 실제로 어떻게 동작하는지 살펴보겠습니다.

 

 

SQL JOIN 함수 완전 정복: INNER, LEFT, RIGHT, FULL

 

 

JOIN이란 무엇인가?

SQL의 JOIN은 두 개 이상의 테이블을 공통된 컬럼(열)을 기준으로 연결하여 데이터를 결합하는 데 사용됩니다. 예를 들어, 직원 정보가 담긴 employees 테이블과 부서 정보가 담긴 departments 테이블이 있다면, 두 테이블을 department_id 컬럼을 기준으로 JOIN할 수 있습니다.

 

주요 JOIN 유형

INNER JOIN

INNER JOIN은 양쪽 테이블 모두에 일치하는 값이 존재할 때만 결과를 반환합니다. 즉, 교집합이라고 생각하면 됩니다.

 

 

📌 예시

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.id;

 

employees 테이블의 department_id와

departments 테이블의 id가 일치하는 경우만 선택됩니다.

 

 

🧠 결과

name                                                              department_name

Alice HR
Bob Engineering

부서 정보가 없는 직원은 결과에 나타나지 않습니다.

 

 

 

LEFT JOIN (또는 LEFT OUTER JOIN)

LEFT JOIN은 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 일치하는 값이 있으면 함께 표시합니다. 오른쪽 테이블에 값이 없으면 NULL로 표시됩니다.

 

📌 예시

SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id;


🧠 결과

name                                                                department_name

Alice HR
Bob Engineering
Carol NULL

Carol은 department_id가 없거나 유효하지 않지만, LEFT JOIN이기 때문에 employees 테이블의 데이터는 유지됩니다.

 

 

RIGHT JOIN (또는 RIGHT OUTER JOIN)

RIGHT JOIN은 LEFT JOIN의 반대입니다. 오른쪽 테이블의 모든 데이터를 기준으로 JOIN하며, 왼쪽 테이블에 일치하는 값이 없으면 NULL로 채웁니다.

 

📌 예시

SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.id;


🧠 결과

name                                                                department_name

Alice HR
Bob Engineering
NULL Finance

Finance 부서는 존재하지만, 해당 부서에 소속된 직원이 없기 때문에 name 컬럼은 NULL입니다.

 

 

FULL OUTER JOIN

FULL OUTER JOIN은 LEFT JOIN과 RIGHT JOIN의 결합입니다. 양쪽 테이블 모두의 데이터를 포함하며, 일치하지 않는 경우에는 NULL로 표시합니다.

 

 

📌 예시

SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.id;


🧠 결과

name                                                                 department_name

Alice HR
Bob Engineering
Carol NULL
NULL Finance

그 외의 JOIN 종류

 


SELF JOIN

자기 자신과 JOIN하는 방식입니다. 하나의 테이블 내에서 관계가 있는 데이터를 연결할 때 사용합니다.

 

📌 예시: 상사와 직원 관계

SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.id;

 

employees 테이블을 두 번 사용하여,

직원과 그 직속 상사를 연결합니다.

 

 

CROSS JOIN

CROSS JOIN은 모든 조합(Cartesian product)을 반환합니다. 예를 들어, A 테이블에 3개, B 테이블에 2개가 있다면 결과는 3x2 = 6개가 됩니다.

 

📌 예시

SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;


🧠 결과

name                                                             department_name

Alice HR
Alice Engineering
Bob HR
Bob Engineering
...  

 

일반적으로 실무에서 잘 사용되진 않지만, 모든 조합이 필요한 경우 사용합니다.

 

JOIN vs 서브쿼리

JOIN은 다수의 테이블을 병합할 수 있다는 점에서 서브쿼리보다 성능이 좋을 수 있고, 가독성이 더 뛰어난 경우가 많습니다. 특히 복잡한 리포트를 만들 때 JOIN은 필수적인 기능입니다.

 

 

실제 업무에서 JOIN을 사용하는 예

고객 테이블과 주문 테이블을 JOIN하여 고객별 주문 내역 조회

상품 테이블과 재고 테이블을 JOIN하여 재고가 부족한 상품 목록 확인

직원과 부서 테이블을 JOIN하여 부서별 직원 수 파악

 

SELECT d.department_name, COUNT(e.id) AS num_employees
FROM departments d
LEFT JOIN employees e
ON d.id = e.department_id
GROUP BY d.department_name;

 

 


주의할 점

JOIN 조건 누락 시 CROSS JOIN이 되어 데이터 수가 급증할 수 있습니다. JOIN 시 사용하는 컬럼에 INDEX가 없다면 성능 저하가 발생할 수 있습니다. NULL 값 처리에 유의해야 합니다. 특히 OUTER JOIN에서는 NULL이 자주 등장합니다.