이 글의 핵심
INNER JOIN은 조건이 일치하는 행만, OUTER JOIN은 기준 테이블의 미일치 행도 보존합니다.
조인 결과 행 수는 키의 유일성과 조건에 맞는 상대 행 개수에 따라 달라집니다.
OUTER JOIN 뒤 WHERE 조건을 잘못 두면 보존했던 NULL 행이 다시 제거될 수 있습니다.
조인은 두 테이블을 가로로 연결한다
조인은 한 테이블의 열만으로 답을 만들 수 없을 때 관련된 테이블의 행을 연결하는 연산입니다. 핵심은 테이블 이름이 아니라 어떤 행끼리 연결되는지 결정하는 ON 조건입니다.
고객 한 명에게 주문이 세 건 있으면 고객 행은 결과에서 세 번 나타납니다. 조인이 중복을 만든 것이 아니라 조건에 맞는 주문 행이 세 개이기 때문에 연결 결과가 세 행이 된 것입니다.
SELECT c.customer_name, o.order_id
FROM customers c
JOIN orders o
ON o.customer_id = c.customer_id;INNER JOIN과 OUTER JOIN의 결정적 차이
INNER JOIN은 ON 조건이 참인 조합만 남깁니다. 주문이 없는 고객처럼 상대 테이블에서 일치 행을 찾지 못하면 결과에서 사라집니다.
LEFT OUTER JOIN은 왼쪽 테이블의 모든 행을 보존합니다. 상대 행이 없으면 오른쪽 열을 NULL로 채웁니다. “주문이 없는 고객도 포함”처럼 기준 집합을 유지하라는 문장이 OUTER JOIN의 신호입니다.
| 조인 | 보존되는 행 | 대표 요구사항 |
|---|---|---|
| INNER JOIN | 양쪽에서 조건이 일치한 행 | 주문한 고객만 조회 |
| LEFT OUTER JOIN | 왼쪽 전체 + 오른쪽 일치 행 | 모든 고객과 주문 조회 |
| FULL OUTER JOIN | 양쪽의 일치·미일치 행 전체 | 양쪽 누락 데이터 비교 |
ON과 WHERE 위치가 결과를 바꾸는 경우
INNER JOIN에서는 필터 조건을 ON이나 WHERE에 두어 같은 결과가 나오는 경우가 많습니다. 하지만 OUTER JOIN에서는 위치가 중요합니다. 오른쪽 테이블 조건을 WHERE에 두면 오른쪽 값이 NULL인 미일치 행이 제거되어 사실상 INNER JOIN처럼 변할 수 있습니다.
SELECT c.customer_id, o.order_id
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.customer_id
AND o.amount >= 100000;“기준 테이블 전체를 남겨야 하는가?”를 먼저 표시하고, 상대 테이블 조건이 ON에 있어야 하는지 판단하세요.
SELF JOIN은 같은 테이블의 서로 다른 역할을 연결한다
사원 테이블 안에 관리자 사원번호가 저장된 조직 구조처럼 한 테이블의 행이 같은 테이블의 다른 행을 참조할 수 있습니다. 이때 같은 테이블에 서로 다른 별칭을 주어 SELF JOIN합니다.
SELECT e.employee_name, m.employee_name AS manager_name
FROM employees e
LEFT JOIN employees m
ON m.employee_id = e.manager_id;조인 문제를 푸는 네 단계
복잡한 조인도 기준 행, 연결 개수, 보존 방향, 후속 필터의 순서로 나누면 계산할 수 있습니다. 실제 시험에서는 작은 표 옆에 각 단계에서 남는 행 번호를 적는 방식이 빠릅니다.
- 각 테이블의 조인 키와 중복 여부를 표시한다.
- ON 조건에 맞는 상대 행 개수를 센다.
- OUTER JOIN이 보존할 미일치 행을 추가한다.
- WHERE 조건으로 최종 제거되는 행을 확인한다.
자체 제작 사례: 고객 3명과 주문 2건으로 LEFT JOIN 결과 예측하기
고객 A·B·C 중 A는 주문 2건, B와 C는 주문이 없다고 가정합니다.
- LEFT JOIN 직후에는 A가 두 행, B와 C가 각각 NULL 주문 한 행으로 총 네 행임을 적습니다.
- WHERE 주문금액 >= 10000 조건을 추가하면 주문이 없는 B·C의 NULL 행이 제거되는지 확인합니다.
- 주문 조건을 ON 절로 옮겼을 때 B·C가 다시 보존되는 결과와 비교합니다.
JOIN 종류만 보지 말고 ON으로 결합된 뒤 WHERE가 어떤 행을 제거하는지 순서대로 추적해야 합니다.
흔한 오답 사고 바로잡기
LEFT JOIN을 사용했으므로 왼쪽 테이블의 행은 WHERE 조건과 관계없이 항상 남는다고 판단한다.
왜 틀리는가: 외부 조인으로 만든 NULL 보존 행도 이후 WHERE 조건을 만족하지 못하면 제거됩니다.
올바른 확인법: 중간 결과에 NULL 확장 행을 먼저 그린 다음 WHERE 조건을 각 행에 적용합니다.
복습 체크리스트
각 테이블의 시작 행 수 기록
조인 키의 중복 여부 확인
외부 조인의 NULL 확장 행 표시
ON과 WHERE 조건 적용 후 최종 행 수 재계산
자주 묻는 질문
LEFT JOIN과 LEFT OUTER JOIN은 다른가요?
같은 의미입니다. OUTER 키워드는 생략할 수 있어 LEFT JOIN이라고 자주 작성합니다.
NATURAL JOIN은 언제 주의해야 하나요?
양쪽 테이블에서 이름이 같은 모든 열을 자동 조인 조건으로 사용합니다. 예상하지 않은 동명 열까지 조건에 포함될 수 있으므로 문제에서 열 구성을 꼼꼼히 확인해야 합니다.
검수 기준과 공식 자료
이 글은 가풀이 직접 작성·검수했으며 실제 기출문제나 복원문제를 옮기지 않았습니다. 시험 일정과 세부 규정은 변경될 수 있으므로 접수 전 아래 공식 공고를 다시 확인하세요.
- SQL 개발자 자격시험 공식 안내 — 한국데이터산업진흥원 데이터자격시험