조인 문법과 결과 건수 읽기
INNER, OUTER, CROSS, NATURAL, USING, ON 조인의 차이를 결과 건수와 NULL 발생 여부 중심으로 정리합니다.
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 | 양쪽 전체, 매칭 없으면 NULL | A ∪ 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 컬럼이 생길 수 있음을 확인합니다
NATURAL과USING은 조인 컬럼에 테이블명을 붙이지 않습니다(+)는 한쪽에만 붙일 수 있고 FULL OUTER는 지원되지 않습니다- 테이블만 나열하고 조건이 없으면 CROSS JOIN (카티션 곱)이 됩니다
조인은 “어떤 행이 남고 어떤 행이 사라지는가”와 “NULL이 어디 생기는가”로 읽습니다.