본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 12 / 32

SQL 기본 및 활용 · 표준 조인 12 / 32

조인 문법과 결과 건수 읽기

INNER, OUTER, CROSS, NATURAL, USING, ON 조인의 차이를 결과 건수와 NULL 발생 여부 중심으로 정리합니다.

출제 빈도 ★★★★★ 관련 문제 8개 | INNER JOINOUTER JOINUSINGNATURALCROSS

조인은 왜 필요한가

한 테이블에 모든 정보를 다 담으면 중복과 수정 이상이 생깁니다. 사원 정보와 부서 정보를 분리한 뒤 조인으로 합쳐 보면 정규화의 이유가 보입니다.

SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno;

이 쿼리는 사원과 그 사원이 속한 부서 이름을 함께 보여줍니다. 조인 조건이 맞는 행끼리만 연결한다는 점이 핵심입니다.

조인 종류 한눈에

조인조건 방식결과 행 수
INNER JOIN매칭 행만 반환A ∩ B
LEFT OUTER JOIN왼쪽 전체 + 매칭되는 오른쪽A 전체
RIGHT OUTER JOIN오른쪽 전체 + 매칭되는 왼쪽B 전체
FULL OUTER JOIN양쪽 전체, 매칭 없으면 NULLA ∪ B
CROSS JOIN조건 없이 모든 조합A × B (카티션 곱)
SELF JOIN같은 테이블을 두 번 사용상황마다 다름
NATURAL JOIN동일 컬럼명 자동 조인INNER와 유사

INNER JOIN — 기본 형태

-- ANSI/ISO 표준 (권장)
SELECT e.ename, d.dname
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno;

-- Oracle 옛 방식
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

두 방식은 같은 결과를 냅니다. ANSI는 조인 조건과 필터 조건을 분리해 가독성과 유지보수에 유리합니다. 실무와 시험 모두 ANSI를 권장합니다.

OUTER JOIN — 매칭 없는 쪽도 살립니다

LEFT OUTER JOIN

왼쪽 테이블 전체를 유지합니다. 오른쪽에 매칭이 없으면 NULL이 됩니다.

-- 부서 없는 사원도 포함
SELECT e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;

RIGHT OUTER JOIN

오른쪽 테이블 전체를 유지합니다. 왼쪽에 매칭이 없으면 NULL이 됩니다.

-- 사원 없는 부서도 포함
SELECT e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;
-- 양쪽 전체 (가장 엄격)
SELECT e.ename, d.dname
FROM emp e
FULL OUTER JOIN dept d ON e.deptno = d.deptno;

FULL OUTER JOIN은 Oracle의 전통 (+) 문법으로는 사용할 수 없으므로 ANSI 표준이 필요합니다.

NATURAL JOIN vs USING vs ON

NATURAL JOIN

동일한 이름과 타입의 모든 컬럼을 자동으로 조인합니다.

SELECT ename, dname
FROM emp NATURAL JOIN dept;
  • 조인 컬럼에 테이블명 수식을 붙이지 않습니다
  • 의도치 않은 컬럼까지 포함될 위험이 있습니다
  • 실무와 시험 모두 지양을 권장합니다

USING · ON

명시적으로 조인 컬럼을 선택합니다.

-- USING: 컬럼 이름이 양쪽에 있을 때
FROM emp JOIN dept USING (deptno);

-- ON: 이름이 다르거나 복잡한 조건
FROM emp e JOIN dept d ON e.dept_id = d.id;

가독성과 안전성 모두 우수합니다.

CROSS JOIN — 카티션 곱

SELECT * FROM emp CROSS JOIN dept;
-- 사원 14명 × 부서 4개 = 56행

조인 조건 없이 모든 행 조합을 반환합니다. 실수로 FROM 절에 여러 테이블을 나열하고 WHERE 조건을 빼먹으면 암시적 CROSS JOIN이 발생하며, 대용량에서는 서버에 큰 부담을 줄 수 있으므로 주의가 필요합니다.

SELF JOIN — 자기 자신과 조인

-- 사원과 그 관리자
SELECT w.ename AS worker, m.ename AS manager
FROM emp w
LEFT JOIN emp m ON w.mgr = m.empno;

같은 테이블을 두 번 쓰므로 별칭이 필요합니다. LEFT OUTER JOIN을 쓰면 관리자가 없는 최상위 사원(KING)도 결과에 포함됩니다.

Non EQUI JOIN — 범위 조건 조인

-- 사원의 급여 등급 찾기
SELECT e.ename, e.sal, s.grade
FROM emp e
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

등호(=)가 아닌 부등호나 BETWEEN으로 조인합니다. 급여 등급 테이블 같은 범위 매칭에 사용합니다.

시험 풀이 기준

  • 결과 행 수가 줄어드는지 그대로인지 먼저 판단합니다
  • OUTER JOIN 결과에 NULL 컬럼이 생길 수 있음을 확인합니다
  • NATURALUSING은 조인 컬럼에 테이블명을 붙이지 않습니다
  • (+)는 한쪽에만 붙일 수 있고 FULL OUTER는 지원되지 않습니다
  • 테이블만 나열하고 조건이 없으면 CROSS JOIN (카티션 곱)이 됩니다

조인은 “어떤 행이 남고 어떤 행이 사라지는가”와 “NULL이 어디 생기는가”로 읽습니다.