topic★★★★★난이도 · 약 40분
JOIN — 테이블 결합
여러 테이블의 행을 결합해 하나의 결과 집합으로. INNER vs OUTER, NULL 처리가 핵심.
#SQL#JOIN#실기핵심
왜 배우는가
'매칭되지 않은 쪽'을 어떻게 처리하느냐가 INNER와 OUTER를 가른다. 실기 SQL 작성에서 잘못된 조인은 한 문제를 통째로 날린다.
은 두 테이블의 행을 조건에 따라 결합한다. 결합 방식은 5가지: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, CROSS.
사원 (EMPLOYEES)
| id | name | 부서ID |
|---|---|---|
| 1 | 홍길동 | 10 |
| 2 | 이순신 | 20 |
| 3 | 세종 | 10 |
| 4 | 유관순 | NULL |
부서 (DEPARTMENTS)
| id | name |
|---|---|
| 10 | 개발 |
| 20 | 영업 |
| 30 | 기획 |
SQL
SELECT ... FROM 사원 e INNER JOIN 부서 d ON e.부서ID = d.id결과 (3행)
| e.id | e.name | d.id | d.name |
|---|---|---|---|
| 1 | 홍길동 | 10 | 개발 |
| 2 | 이순신 | 20 | 영업 |
| 3 | 세종 | 10 | 개발 |
JOIN 타입을 바꿔보며 매칭되지 않은 쪽(유관순 / 기획부)이 어떻게 처리되는지 확인해 보자.
sql
-- INNER JOIN (ANSI 표준)
SELECT e.이름, d.부서명
FROM 사원 e
INNER JOIN 부서 d
ON e.부서ID = d.id;
-- 같은 의미, 구식 표기 (WHERE 조인)
SELECT e.이름, d.부서명
FROM 사원 e, 부서 d
WHERE e.부서ID = d.id;
-- LEFT OUTER: 부서 없는 사원도 포함
SELECT e.이름, d.부서명
FROM 사원 e
LEFT OUTER JOIN 부서 d ON e.부서ID = d.id;
-- FULL OUTER: 양쪽 모두 보존
SELECT e.이름, d.부서명
FROM 사원 e
FULL OUTER JOIN 부서 d ON e.부서ID = d.id;SELF JOIN — 같은 테이블을 자기 자신과 조인. 별칭이 필수다. `FROM 사원 e1 INNER JOIN 사원 e2 ON e1.사수ID = e2.id`.
매칭 안 되는 행 찾기 패턴: `LEFT OUTER JOIN ... WHERE 오른쪽.id IS NULL`. 이 패턴은 '부서 없는 사원' 같은 질의에서 필수.
실기 드릴 3문항
database실기 드릴 · SQL 작성
`사원`과 `부서`를 조인해서 부서가 없는 사원의 이름도 함께 조회하는 SQL을 작성하시오.
edit실기 드릴 · 단답형
두 테이블의 모든 가능한 조합을 만드는 조인(카티션 곱)을 무엇이라 하는가?
database실기 드릴 · SQL 작성
`사원` 테이블에서 자신의 사수의 이름을 함께 조회하는 SELF JOIN SQL을 작성하시오. (사원.사수ID는 같은 테이블의 id를 참조)