JOIN 완벽 정리
SQLD 시험 출제 범위의 INNER·OUTER·CROSS·NATURAL JOIN을 예시 테이블과 함께 정리
1. JOIN 개념
JOIN이란?
두 개 이상의 테이블을 특정 조건으로 연결하여 데이터를 조회하는 방법입니다. 관계형 데이터베이스에서 데이터가 여러 테이블에 분산되어 있으므로, 원하는 정보를 얻기 위해 JOIN이 필수적입니다.
예시 테이블
아래 두 테이블을 기준으로 각 JOIN의 결과를 설명합니다.
EMP (사원)
| EMP_ID | NAME | DEPT_ID |
|---|---|---|
| 1 | 김철수 | 10 |
| 2 | 이영희 | 20 |
| 3 | 박민수 | NULL |
DEPT (부서)
| DEPT_ID | DEPT_NAME |
|---|---|
| 10 | 개발팀 |
| 20 | 기획팀 |
| 30 | 인사팀 |
2. INNER JOIN (EQUI JOIN)
개념
양쪽 테이블에서 조건이 일치하는 행만 결합하여 반환합니다. 매칭되지 않는 행은 결과에서 제외됩니다.
결과 테이블
| EMP_ID | NAME | DEPT_ID | DEPT_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_ID | NAME | DEPT_ID | DEPT_NAME |
|---|---|---|---|
| 1 | 김철수 | 10 | 개발팀 |
| 2 | 이영희 | 20 | 기획팀 |
| 3 | 박민수 | NULL | NULL |
왼쪽(EMP) 기준이므로 박민수도 포함, 매칭 부서 없어 DEPT_NAME=NULL → 결과: 3행
4. RIGHT OUTER JOIN
개념
오른쪽 테이블의 모든 행을 보존하고, 왼쪽 테이블에서 매칭되는 행이 없으면 NULL로 채웁니다.
결과 테이블 (EMP RIGHT JOIN DEPT)
| EMP_ID | NAME | DEPT_ID | DEPT_NAME |
|---|---|---|---|
| 1 | 김철수 | 10 | 개발팀 |
| 2 | 이영희 | 20 | 기획팀 |
| NULL | NULL | 30 | 인사팀 |
오른쪽(DEPT) 기준이므로 인사팀도 포함, 매칭 사원 없어 EMP 컬럼=NULL → 결과: 3행
5. FULL OUTER JOIN
개념
양쪽 테이블의 모든 행을 보존합니다. LEFT와 RIGHT OUTER JOIN의 합집합이라고 볼 수 있습니다.
결과 테이블 (EMP FULL OUTER JOIN DEPT)
| EMP_ID | NAME | DEPT_ID | DEPT_NAME |
|---|---|---|---|
| 1 | 김철수 | 10 | 개발팀 |
| 2 | 이영희 | 20 | 기획팀 |
| 3 | 박민수 | NULL | NULL |
| NULL | NULL | 30 | 인사팀 |
양쪽 모두 보존 → 박민수(부서 없음)와 인사팀(사원 없음) 모두 포함 → 결과: 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.col | USING(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 JOIN | M 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 값끼리는 조인되지 않음
개념을 확인했다면 문제로 실력을 검증해보세요