JOIN 완벽 정리

SQLD 시험 출제 범위의 INNER·OUTER·CROSS·NATURAL JOIN을 예시 테이블과 함께 정리

1. JOIN 개념

JOIN이란?

두 개 이상의 테이블을 특정 조건으로 연결하여 데이터를 조회하는 방법입니다. 관계형 데이터베이스에서 데이터가 여러 테이블에 분산되어 있으므로, 원하는 정보를 얻기 위해 JOIN이 필수적입니다.

예시 테이블

아래 두 테이블을 기준으로 각 JOIN의 결과를 설명합니다.

EMP (사원)

EMP_IDNAMEDEPT_ID
1김철수10
2이영희20
3박민수NULL

DEPT (부서)

DEPT_IDDEPT_NAME
10개발팀
20기획팀
30인사팀

2. INNER JOIN (EQUI JOIN)

개념

양쪽 테이블에서 조건이 일치하는 행만 결합하여 반환합니다. 매칭되지 않는 행은 결과에서 제외됩니다.

결과 테이블

EMP_IDNAMEDEPT_IDDEPT_NAME
1김철수10개발팀
2이영희20기획팀

박민수(DEPT_ID=NULL)와 인사팀(DEPT_ID=30)은 매칭되지 않아 제외 → 결과: 2행

SQL 구문

방식구문
ANSI 표준SELECT * FROM EMP INNER JOIN DEPT ON EMP.DEPT_ID = DEPT.DEPT_ID
Oracle 전통SELECT * FROM EMP, DEPT WHERE EMP.DEPT_ID = DEPT.DEPT_ID

3. LEFT OUTER JOIN

개념

왼쪽 테이블의 모든 행을 보존하고, 오른쪽 테이블에서 매칭되는 행이 없으면 NULL로 채웁니다.

결과 테이블 (EMP LEFT JOIN DEPT)

EMP_IDNAMEDEPT_IDDEPT_NAME
1김철수10개발팀
2이영희20기획팀
3박민수NULLNULL

왼쪽(EMP) 기준이므로 박민수도 포함, 매칭 부서 없어 DEPT_NAME=NULL → 결과: 3행

4. RIGHT OUTER JOIN

개념

오른쪽 테이블의 모든 행을 보존하고, 왼쪽 테이블에서 매칭되는 행이 없으면 NULL로 채웁니다.

결과 테이블 (EMP RIGHT JOIN DEPT)

EMP_IDNAMEDEPT_IDDEPT_NAME
1김철수10개발팀
2이영희20기획팀
NULLNULL30인사팀

오른쪽(DEPT) 기준이므로 인사팀도 포함, 매칭 사원 없어 EMP 컬럼=NULL → 결과: 3행

5. FULL OUTER JOIN

개념

양쪽 테이블의 모든 행을 보존합니다. LEFT와 RIGHT OUTER JOIN의 합집합이라고 볼 수 있습니다.

결과 테이블 (EMP FULL OUTER JOIN DEPT)

EMP_IDNAMEDEPT_IDDEPT_NAME
1김철수10개발팀
2이영희20기획팀
3박민수NULLNULL
NULLNULL30인사팀

양쪽 모두 보존 → 박민수(부서 없음)와 인사팀(사원 없음) 모두 포함 → 결과: 4행

6. CROSS JOIN (CARTESIAN PRODUCT)

개념

조인 조건 없이 모든 행의 조합을 만듭니다. 결과 행 수 = M x N (왼쪽 행 수 x 오른쪽 행 수). 위 예시에서는 3 x 3 = 9행이 됩니다.

SQL 구문

방식구문
ANSI 표준SELECT * FROM EMP CROSS JOIN DEPT
Oracle 전통SELECT * FROM EMP, DEPT (WHERE 절 없이)

의도하지 않은 CROSS JOIN은 성능 문제를 야기합니다. WHERE절을 빠뜨리면 카테시안 곱이 발생합니다.

7. NATURAL JOIN

개념

두 테이블에서 같은 이름의 모든 컬럼을 자동으로 조인 조건에 사용합니다. ON이나 USING 절을 별도로 쓰지 않습니다.

주의사항

  • 1. 같은 이름 컬럼이 여러 개면 모두 조건에 포함 — 의도치 않은 결과가 나올 수 있음
  • 2. 조인 컬럼에 테이블 별칭 사용 불가 — SELECT E.DEPT_ID (X) → SELECT DEPT_ID (O)
  • 3. 결과에서 조인 컬럼은 하나만 표시 — INNER JOIN과 달리 중복 컬럼이 제거됨
  • 4. 컬럼 추가/변경 시 결과가 달라질 수 있음 — 테이블 구조 변경에 취약

SQL 구문

SELECT * FROM EMP NATURAL JOIN DEPT

DEPT_ID가 같은 이름이므로 자동으로 EMP.DEPT_ID = DEPT.DEPT_ID 조건이 적용됩니다.

8. USING절 vs ON절

비교 테이블

항목ON절USING절
조건 지정ON A.col = B.colUSING(col)
컬럼명 불일치가능 (다른 이름도 OK)불가 (같은 이름만)
별칭 사용조인 컬럼에 별칭 사용 가능조인 컬럼에 별칭 사용 불가
추가 조건ON절 안에 AND로 추가 가능별도 WHERE절 필요
결과 컬럼조인 컬럼 2개 표시조인 컬럼 1개 표시 (NATURAL과 동일)

9. Oracle (+) 구문 vs ANSI 표준 구문

Oracle (+) 기호 규칙

(+)는 데이터가 부족한 쪽(NULL이 채워지는 쪽)에 붙입니다.

ANSI 표준Oracle (+) 구문
EMP LEFT JOIN DEPT ON ...WHERE EMP.DEPT_ID = DEPT.DEPT_ID(+)
EMP RIGHT JOIN DEPT ON ...WHERE EMP.DEPT_ID(+) = DEPT.DEPT_ID
EMP FULL OUTER JOIN DEPT ON ...(+) 구문으로는 불가 → ANSI 표준 사용 필수

(+) 위치 암기법

"(+)는 없는 쪽에 붙인다" — LEFT JOIN이면 오른쪽 테이블이 부족하므로 오른쪽에 (+), RIGHT JOIN이면 왼쪽에 (+)를 붙입니다.

10. JOIN별 결과 행 수 계산

행 수 계산 공식

JOIN 유형결과 행 수위 예시
INNER JOIN매칭되는 행의 수2행
LEFT OUTER왼쪽 전체 + 왼쪽에만 있는 행3행 (2 + 1)
RIGHT OUTER오른쪽 전체 + 오른쪽에만 있는 행3행 (2 + 1)
FULL OUTER매칭 + 왼쪽만 + 오른쪽만4행 (2 + 1 + 1)
CROSS JOINM x N (행 수의 곱)9행 (3 x 3)

1:N 관계에서 INNER JOIN 결과는 N쪽 행 수만큼 늘어날 수 있습니다 (1쪽 1행이 N쪽 여러 행과 매칭).

11. 시험 빈출 함정

OUTER JOIN + WHERE 조건 → INNER JOIN으로 변하는 케이스

이것은 SQLD 시험에서 가장 자주 출제되는 함정입니다.

SELECT * FROM EMP E
LEFT OUTER JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID
WHERE D.DEPT_NAME = '개발팀'

LEFT JOIN이지만 WHERE절에서 오른쪽 테이블(DEPT) 컬럼에 조건을 걸면, NULL 행이 걸러져서 실질적으로 INNER JOIN과 같은 결과가 됩니다. OUTER JOIN 효과를 유지하려면 WHERE 대신 ON절에 조건을 추가해야 합니다.

기타 빈출 포인트

  • 1. NATURAL JOIN + USING/ON 동시 사용 불가 — NATURAL JOIN은 자동 조건이므로 별도 조건절 지정 불가
  • 2. CROSS JOIN에 ON/WHERE 쓰면 INNER JOIN — CROSS JOIN에 조건을 추가하면 사실상 INNER JOIN과 동일
  • 3. (+) 구문 양쪽 동시 사용 불가 — Oracle에서 FULL OUTER JOIN은 (+)로 표현할 수 없음
  • 4. USING절의 컬럼에 테이블 별칭 사용 불가 — SELECT E.DEPT_ID (X) → SELECT DEPT_ID (O)
  • 5. 3개 이상 테이블 조인 순서 — A JOIN B ON ... JOIN C ON ... 순서대로 처리, 앞선 조인 결과에 다음 조인 적용
  • 6. NULL과 조인 — NULL = NULL은 FALSE이므로 NULL 값끼리는 조인되지 않음

개념을 확인했다면 문제로 실력을 검증해보세요