조인은 관계형 데이터베이스(RDBMS) 에서 가장 중요한 개념 중 하나다.
여러 테이블로 나누어 저장된 데이터를 논리적으로 연결해 하나의 결과로 합치는 역할을 한다.
즉, 데이터의 정규화를 유지하면서도 필요한 정보를 쉽게 조회할 수 있게 해준다.
1. INNER JOIN — 일치하는 데이터만 추출
특징:
두 테이블 간의 공통된 데이터(조인 조건을 만족하는 행) 만 결과에 포함한다.
가장 일반적이며, 데이터의 정확한 매칭 관계를 찾을 때 사용된다.
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;
결과:
- 부서가 있는 직원만 표시됨
- 부서가 없는 직원, 직원이 없는 부서는 제외됨
사용 예시:
직원과 부서 정보를 함께 보여주고 싶을 때
(예: “각 직원이 속한 부서 이름을 출력하시오”)
2. OUTER JOIN — 일치하지 않는 데이터도 포함
OUTER JOIN은 조인 조건을 만족하지 않아도 특정 테이블의 데이터를 결과에 포함한다.
누락된 데이터까지 함께 보고 싶을 때 사용한다.
종류는 LEFT, RIGHT, FULL 세 가지다.
(1) LEFT OUTER JOIN — 왼쪽 테이블 기준
특징:
왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블의 데이터는 일치하는 경우에만 포함한다.
일치하지 않으면 NULL로 표시된다.
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.department_id = d.department_id;
결과:
- 모든 직원이 표시됨
- 부서가 없는 직원은 department_name이 NULL로 표시됨
사용 예시:
모든 직원 목록을 보여주되, 부서 정보가 없으면 NULL로 표시하고 싶을 때
(2) RIGHT OUTER JOIN — 오른쪽 테이블 기준
특징:
오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블의 데이터는 일치하는 경우에만 표시한다.
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id;
결과:
- 모든 부서가 표시됨
- 직원이 없는 부서는 employee_id, first_name이 NULL로 표시됨
사용 예시:
모든 부서를 표시하면서, 소속 직원이 없는 부서도 함께 보고 싶을 때
(3) FULL OUTER JOIN — 양쪽 테이블의 모든 데이터 포함
특징:
양쪽 테이블의 모든 행을 결과에 포함시킨다.
일치하지 않는 행은 NULL로 채운다.
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id;
결과:
- 모든 직원과 모든 부서가 표시됨
- 부서 없는 직원, 직원 없는 부서 모두 NULL로 표시됨
사용 예시:
직원과 부서 간의 전체 관계를 한 번에 확인하고 싶을 때
3. CROSS JOIN — 가능한 모든 조합 생성
특징:
두 테이블의 모든 행 조합(카테시안 곱) 을 생성한다.
조건문이 없으므로, 결과의 행 수는 두 테이블 행 수의 곱이 된다.
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
CROSS JOIN departments d;
결과:
- 모든 직원 × 모든 부서의 조합이 생성됨
주의:
테이블 크기가 크면 결과가 매우 커지므로 실무에서는 주의해서 사용해야 한다.
사용 예시:
모든 가능한 조합을 테스트하거나, 임시 데이터셋을 만들 때
4. SELF JOIN — 같은 테이블 간의 관계 탐색
특징:
하나의 테이블을 자기 자신과 조인하는 방식이다.
계층 구조나 상하 관계(예: 직원 ↔ 관리자)를 표현할 때 자주 사용된다.
SELECT e1.employee_id, e1.first_name, e2.first_name AS manager_name
FROM employees e1
LEFT JOIN employees e2
ON e1.manager_id = e2.employee_id;
결과:
- 각 직원과 그 직원의 관리자가 함께 표시됨
- 관리자가 없는 경우(예: CEO)는 manager_name이 NULL로 표시됨
사용 예시:
“직원과 그 직원의 상사를 함께 출력하시오.”
조인의 선택 기준과 중요성
| INNER JOIN | 일치하는 행만 | 두 테이블의 관계가 확실할 때 |
| LEFT JOIN | 왼쪽 전체 + 오른쪽 일치 | 기준 테이블의 모든 데이터 유지 |
| RIGHT JOIN | 오른쪽 전체 + 왼쪽 일치 | 참조 테이블의 전체 데이터 유지 |
| FULL JOIN | 양쪽 전체 | 전체 관계를 모두 파악할 때 |
| CROSS JOIN | 모든 조합 | 테스트/통계용 데이터 생성 |
| SELF JOIN | 동일 테이블 | 계층 구조 표현 (예: 직원-관리자) |
성능과 최적화 고려
조인 연산은 데이터베이스 성능에 큰 영향을 미친다.
따라서 다음과 같은 점들을 반드시 고려해야 한다.
- 인덱스(Index) — 조인 조건으로 사용되는 컬럼에 인덱스를 생성하면 검색 속도 향상
- 조인 순서 최적화 — 작은 테이블을 먼저 조인하면 효율적
- 불필요한 컬럼 제거 — SELECT * 대신 필요한 컬럼만 명시
- 조건 필터링 — WHERE 절을 적극적으로 활용해 데이터 범위 축소
'DBMS > 개념' 카테고리의 다른 글
| 21_ 집합 연산자 (0) | 2025.10.20 |
|---|---|
| 20_ 서브쿼리 (0) | 2025.10.18 |
| 18_ 조인(Join)과 서브쿼리(Subquery) (0) | 2025.10.14 |
| 17_ 뷰(view) (0) | 2025.10.11 |
| 16_ 트랜잭션 (Transaction) (0) | 2025.10.09 |