공든탑앱 열기

OUTER JOIN

SQLD (SQL 개발자) · 조인 · 약 14분

쉽게 말하면

보통 조인은 짝이 있는 줄만 남겨요. OUTER JOIN은 짝이 없는 줄도 버리지 않고 남겨요. 동아리에 안 든 학생도 명단에 남기고, 동아리 칸은 비워 두는 식이에요. 왼쪽 표를 다 남기면 LEFT, 오른쪽이면 RIGHT, 양쪽 다면 FULL이에요.

시험용 정의

OUTER JOIN은 조인 조건에 맞는 짝이 없는 행도 결과에 남기는 조인이다. LEFT는 왼쪽 테이블, RIGHT는 오른쪽 테이블, FULL은 양쪽 모두의 행을 남기고, 짝이 없는 반대쪽 열은 NULL로 채운다. Oracle 옛 문법은 WHERE에서 짝이 없을 수 있는 쪽(NULL로 채워질 쪽)에 (+)를 붙인다.

비유로 이해하기

반 학생 명단(왼쪽)에 동아리 가입 명단(오른쪽)을 붙이는 것이다. INNER는 동아리에 든 학생만, LEFT는 동아리가 없는 학생도 빈칸으로 남기고, FULL은 학생 없는 빈 동아리까지 모두 보여 준다.

자세히

먼저 알아 둘 말

말뜻
기준 테이블OUTER JOIN에서 모든 행이 남는 쪽. LEFT면 왼쪽
(+)Oracle 전용 외부 조인 표시. NULL로 채워질 쪽 열에 붙인다
OH연습 데이터에서 부서(DEPTNO)가 NULL인 사원. 40번 HR은 사원이 없는 부서

종류 비교 (EMP e ? JOIN DEPT d ON e.deptno = d.deptno)

조인결과행 수
INNER짝이 있는 것만11 (OH 빠짐, HR 빠짐)
LEFT OUTEREMP 전부 + 짝 없으면 DEPT 쪽 NULL12 (OH 포함)
RIGHT OUTERDEPT 전부 + 짝 없으면 EMP 쪽 NULL12 (HR 포함)
FULL OUTER양쪽 전부13 (OH, HR 모두)

Oracle (+) 표기

WHERE e.deptno = d.deptno(+)는 DEPT 쪽이 비어도 된다는 뜻이라 EMP LEFT OUTER JOIN DEPT와 같다. (+)는 모자란 쪽, NULL이 채워질 쪽에 붙는다고 기억하자. (+)로는 FULL OUTER JOIN을 만들 수 없고, 한 조건에서 양쪽에 (+)를 붙일 수도 없다. 다른 조건도 그 테이블에 대해서는 (+)를 붙여야 외부 조인이 유지된다.

ON 조건 vs WHERE 조건

OUTER JOIN에서 ON에 쓴 조건은 "짝을 찾을 때" 쓰여서, 맞지 않아도 기준 테이블 행은 남는다. WHERE에 쓴 조건은 "다 만든 결과"를 거르므로 NULL로 채워진 행이 빠질 수 있다.

  • dept d LEFT JOIN emp e ON d.deptno = e.deptno AND e.job = 'MANAGER' → 부서 4개 모두, 매니저가 없으면 NULL
  • dept d LEFT JOIN emp e ON d.deptno = e.deptno WHERE e.job = 'MANAGER' → 매니저가 있는 부서 2개만 (사실상 INNER JOIN)

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. 사원이 한 명도 없는 40번 부서(HR)까지 부서 목록에 모두 나오게 하려면 DEPT를 기준으로 어떤 조인을 써야 할까요?

  1. DEPT NATURAL JOIN EMP
  2. EMP LEFT OUTER JOIN DEPT
  3. INNER JOIN
  4. DEPT LEFT OUTER JOIN EMP
정답 보기

4번 DEPT LEFT OUTER JOIN EMP

OUTER JOIN은 짝이 없는 행도 남긴다. LEFT는 왼쪽(먼저 쓴) 테이블의 모든 행을 남기므로 DEPT를 왼쪽에 둔다. 짝이 없는 EMP 쪽 열은 NULL로 채워진다.

Q2. WHERE a.id = b.id(+)와 같은 표준 조인은?

  1. a FULL OUTER JOIN b
  2. a LEFT OUTER JOIN b
  3. a RIGHT OUTER JOIN b
  4. a INNER JOIN b
정답 보기

2번 a LEFT OUTER JOIN b

(+)가 붙은 b가 모자란 쪽이므로 a의 모든 행이 남는 a LEFT JOIN b.

Q3. A(1, 2, 3)와 B(2, 3, 4)를 값으로 FULL OUTER JOIN 하면 결과 행 수는?

  1. 2
  2. 3
  3. 4
  4. 6
정답 보기

3번 4

짝 있는 2·3 두 행 + A만 있는 1 + B만 있는 4 = 4행.

Q4. DEPT LEFT JOIN EMP 후 부서별 사원 수를 셀 때, 사원 없는 부서가 0으로 나오는 것은?

  1. SUM(1)
  2. COUNT(d.deptno)
  3. COUNT(e.empno)
  4. COUNT(*)
정답 보기

3번 COUNT(e.empno)

사원 없는 부서도 NULL로 채운 한 행이 있으므로 EMP 쪽 열을 세야 0이 된다.

Q5. DEPT LEFT OUTER JOIN EMP 에서 사원이 없는 부서는?

  1. 오류가 난다
  2. 사원 열이 NULL인 한 행으로 나온다
  3. 결과에서 빠진다
  4. 두 번 나온다
정답 보기

2번 사원 열이 NULL인 한 행으로 나온다

왼쪽(DEPT) 행은 모두 남고, 짝이 없으면 오른쪽 열을 NULL로 채운다.

Q6. A LEFT OUTER JOIN B 뒤에 WHERE b.status = 'Y' 를 쓰면?

  1. B 행만 남는다
  2. OUTER JOIN 결과가 그대로 남는다
  3. 짝이 없던 행이 빠져 INNER JOIN처럼 된다
  4. 오류가 난다
정답 보기

3번 짝이 없던 행이 빠져 INNER JOIN처럼 된다

짝 없는 행은 b.status가 NULL이라 WHERE에서 걸러진다. 남기려면 조건을 ON에 쓴다.

헷갈리기 쉬운 O·X

Oracle의 (+) 표기로 FULL OUTER JOIN을 만들 수 있다.

정답 보기

X (+)는 한쪽 외부 조인만 된다. FULL은 표준 문법이나 UNION으로.

OUTER JOIN에서 기준 테이블 쪽 조건을 ON 대신 WHERE에 쓰면 결과가 달라질 수 있다.

정답 보기

O WHERE는 다 만든 결과를 거르므로 NULL로 채운 행이 빠질 수 있다.

LEFT OUTER JOIN에서 오른쪽 테이블에 짝이 없으면 그 행은 결과에서 빠진다.

정답 보기

X 왼쪽 행은 남고 오른쪽 열이 NULL로 채워진다.

함께 보면 좋은 개념