조인(JOIN)이란, **두 개 이상의 릴레이션(테이블)**을 **공통된 속성(키)**을 기준으로 결합하여 새로운 릴레이션을 생성하는 연산입니다. 이는 관계형 모델에서 **데이터 분리(정규화)**로 인해 나뉜 테이블을 논리적으로 다시 연결할 때 사용됩니다.
A ⋈ B ON A.x = B.x
= σ(A.x = B.x)(A × B)구분 | 설명 | SQL 예시 |
---|---|---|
내부 조인 (Inner Join) | 양쪽 테이블에서 조건을 만족하는 튜플만 결과에 포함 | SELECT * FROM A JOIN B ON A.id = B.id |
외부 조인 (Outer Join) | 조건 불충족 시에도 한쪽 데이터를 유지 | LEFT OUTER JOIN , RIGHT OUTER JOIN , FULL OUTER JOIN |
자연 조인 (Natural Join) | 공통 속성명을 자동으로 매칭하여 등가 조건 생성 | SELECT * FROM A NATURAL JOIN B |
자기 조인 (Self Join) | 동일 테이블을 두 번 사용하여 조인 | FROM Emp A, Emp B WHERE A.manager_id = B.id |
교차 조인 (Cross Join) | 조건 없이 모든 조합 생성 (카티션 곱) | SELECT * FROM A CROSS JOIN B |
조인은 데이터 양이 많을 경우 성능에 큰 영향을 주므로, RDBMS는 효율적인 조인 알고리즘을 사용합니다.
for each row R1 in outer_table:
for each row R2 in inner_table:
if join_condition(R1, R2):
emit(R1, R2)
알고리즘 | 장점 | 단점 | 적합한 상황 |
---|---|---|---|
Nested Loop | 단순, 인덱스 활용 시 빠름 | 인덱스 없으면 비효율 | 소규모, 인덱스 있음 |
Hash Join | 빠름, 정렬 불필요 | 범위 조건 불가, 메모리 사용 | 대용량, 등가 조인 |
Sort-Merge | 범위 조건 가능 | 정렬 비용 있음 | 정렬된 대량 데이터 |
DBMS 옵티마이저는 다음 요소를 고려하여 조인 전략을 자동 선택합니다:
조인은 레고 블록을 연결해서 하나의 멋진 장난감을 만드는 것과 비슷해요!
- 중첩 반복(Nested Loop): 모든 블록을 다 비교해봄
- 해시 조인(Hash Join): 레고 이름표로 빠르게 찾음
- 정렬 병합(Sort-Merge): 색깔 순서대로 정리해서 붙이기