SQL 조인 (JOIN)의 종류

한눈에 보기

SQL 조인은 여러 테이블을 공통 컬럼으로 연결해 하나의 결과로 조회하는 연산이다. INNER, LEFT, FULL, CROSS, SELF 조인의 차이와 예시 쿼리, ON과 WHERE의 차이, 조인 알고리즘을 정리한다.

최종 업데이트 2026.09.17

SQL 조인(JOIN)은 두 개 이상의 테이블을 공통 컬럼을 기준으로 연결해서 하나의 결과 집합으로 조회하는 연산이다. 정규화로 나뉜 테이블들을 다시 합쳐 의미 있는 정보를 만들 때 사용하며, 매칭되지 않는 행을 어떻게 처리하느냐에 따라 내부 조인, 외부 조인, 교차 조인 등으로 나뉜다.

조인이 필요한 이유

정규화된 데이터베이스에서는 사용자 정보와 주문 정보가 서로 다른 테이블에 저장된다. "어떤 사용자가 무엇을 주문했는지"를 알려면 두 테이블을 사용자 아이디라는 공통 컬럼으로 연결해야 하는데, 이 연결이 바로 조인이다. 조인의 결과는 조건을 만족하는 두 테이블 행의 조합으로 만들어진 새로운 행들이다.

이후 예시는 회원 테이블 users(id, name)와 주문 테이블 orders(id, user_id, amount)를 기준으로 한다. 주문하지 않은 회원과, 탈퇴 등으로 회원이 없는 주문이 섞여 있다고 가정한다.

조인의 종류

내부 조인(INNER JOIN)

양쪽 테이블 모두에서 조인 조건을 만족하는 행만 결과에 포함한다. 주문한 적 있는 회원과 그 주문만 나온다.

SQL 조인 종류: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER 조인이 두 테이블에서 어느 행을 남기는지 벤 다이어그램으로 비교
벤 다이어그램은 «어느 행을 남기느냐»만 보여 준다는 점을 기억하자. 실제 결과 행 수는 ON 조건에 맞는 짝이 여러 개면 곱으로 늘어난다(1:N이면 N행). 면접에서는 LEFT JOIN 뒤에 WHERE b.col = … 을 붙이면 INNER JOIN과 같아지는 이유까지 물어본다.
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON o.user_id = u.id;

왼쪽 외부 조인(LEFT OUTER JOIN)

왼쪽 테이블의 모든 행을 남기고, 오른쪽에서 매칭되는 행이 없으면 오른쪽 컬럼을 널(NULL)로 채운다. 주문이 없는 회원도 결과에 포함되므로 "주문한 적 없는 회원 찾기" 같은 질의에 활용된다.

-- 주문한 적 없는 회원 조회
SELECT u.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;

오른쪽 외부 조인(RIGHT OUTER JOIN)

오른쪽 테이블의 모든 행을 남기는 조인이다. 테이블 순서를 바꾼 왼쪽 조인과 동일한 결과를 내므로, 실무에서는 가독성을 위해 왼쪽 조인으로 통일해 쓰는 경우가 많다.

완전 외부 조인(FULL OUTER JOIN)

양쪽 테이블의 모든 행을 남기고, 매칭되지 않는 쪽을 널로 채운다. 두 데이터 집합의 차이를 한 번에 비교할 때 유용하다. MySQL은 이를 직접 지원하지 않아 왼쪽 조인과 오른쪽 조인의 결과를 UNION으로 합쳐 흉내 낸다.

교차 조인(CROSS JOIN)

조건 없이 두 테이블의 모든 행 조합, 즉 카티션 곱(Cartesian Product)을 만든다. 회원 100명과 상품 50개를 교차 조인하면 5000행이 나온다. 날짜 목록과 카테고리 목록의 모든 조합을 만들어 통계 빈칸을 채우는 식의 용도가 아니면 의도치 않은 폭발적 결과에 주의해야 한다.

셀프 조인(SELF JOIN)

한 테이블을 자기 자신과 조인하는 기법이다. 직원 테이블에서 각 직원과 그 상사를 함께 조회하는 경우처럼, 같은 테이블 안에 계층이나 참조 관계가 있을 때 별칭(Alias)을 다르게 붙여 사용한다.

종류별 비교

종류결과에 포함되는 행널 발생대표 용도
INNER JOIN양쪽 모두 매칭되는 행없음연관 데이터 조회
LEFT JOIN왼쪽 전체와 매칭되는 오른쪽오른쪽 컬럼기준 테이블 유지 조회
RIGHT JOIN오른쪽 전체와 매칭되는 왼쪽왼쪽 컬럼LEFT JOIN으로 대체 가능
FULL OUTER JOIN양쪽 전체양쪽 컬럼두 집합의 차이 비교
CROSS JOIN모든 행 조합없음조합 생성
SELF JOIN조건에 따름조건에 따름계층, 자기 참조 조회

ON 절과 WHERE 절의 차이

외부 조인에서 조건을 ON 절에 쓰느냐 WHERE 절에 쓰느냐에 따라 결과가 달라진다. ON 절의 조건은 조인 시점에 매칭 여부를 판단하는 기준이므로 매칭 실패 행도 널과 함께 살아남지만, WHERE 절의 조건은 조인이 끝난 결과에서 행을 걸러내므로 널이 된 행이 제거되어 외부 조인이 사실상 내부 조인처럼 변해 버린다. 예를 들어 왼쪽 조인 뒤 WHERE에 o.amount > 10000을 쓰면 주문 없는 회원이 모두 사라진다. 오른쪽 테이블에 대한 필터는 ON 절에 두어야 외부 조인의 의미가 유지된다.

조인의 내부 동작

데이터베이스 옵티마이저는 조인을 실행할 때 몇 가지 물리적 알고리즘 중 하나를 선택한다. 중첩 루프 조인(Nested Loop Join)은 한쪽 테이블을 순회하며 다른 쪽을 반복 탐색하는 방식으로, 안쪽 테이블의 조인 컬럼에 인덱스가 있을 때 효율적이다. 해시 조인(Hash Join)은 한쪽으로 해시 테이블을 만들어 매칭하는 방식으로 대용량 동등 조인에 유리하고, 소트 머지 조인(Sort Merge Join)은 양쪽을 정렬한 뒤 병합하는 방식이다. 조인 컬럼에 적절한 인덱스를 만들고 실행 계획을 확인하는 습관이 조인 성능 튜닝의 출발점이다.

면접에서 이렇게 물어본다

  • INNER JOIN과 LEFT JOIN의 차이를 결과 행 관점에서 설명해 보라.
  • 주문한 적 없는 회원을 조회하는 쿼리를 조인으로 작성해 보라.
  • 외부 조인에서 ON 절과 WHERE 절에 조건을 둘 때 결과가 어떻게 달라지는가.
  • 중첩 루프 조인과 해시 조인은 각각 어떤 상황에 유리한가.
  • MySQL에서 FULL OUTER JOIN을 구현하려면 어떻게 해야 하는가.
데이터베이스 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기