핵심 요약
여러 테이블을 관계 조건으로 연결하고 Equi·
Equi·
학습 목표
- 조인 조건과 일반 필터 조건을 구분한다.
- Equi·
Non-Equi· Self Join의 사용 사례를 설명한다.
본문
개념 지도
각 입력의 Key 확인→조인 조건→일치·미일치 행 규칙→중복·NULL 결과 검증핵심 내용
조인은 서로 다른 행 집합을 관련 컬럼으로 연결한다. 조인 조건이 빠지면 두 집합의 모든 조합인 Cartesian Product가 만들어질 수 있다.
SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON d.deptno = e.deptno;
= 조건의 Equi Join이 가장 흔하다. 구간 등급표처럼 BETWEEN, <, >로 연결하면 Non-Equi Join이다. Self Join은 같은 테이블에 서로 다른 별칭을 주어 상사-부하처럼 행 사이 관계를 표현한다.
SELECT e.ename AS employee, m.ename AS manager
FROM emp e
LEFT JOIN emp m ON m.empno = e.mgr;
조인 결과 건수는 키 제약과 데이터 관계에 달려 있다. PK-FK의 정상적인 N:1 조인은 자식 행이 부모 한 건과 매칭되지만, 조인 컬럼이 유일하지 않으면 행이 증폭될 수 있다.
작은 데이터로 Join 결과 계산하기
EMP(empno, deptno): (1,10), (2,20), (3,NULL)
DEPT(deptno,name): (10,'SALES'), (30,'HR')
Inner Equi Join e.deptno=d.deptno의 결과는 empno 1 한 건이다. empno 2는 부모 Match가 없고 empno 3은 NULL 비교가 UNKNOWN이다. Left Outer Join이면 empno 2·
Non-Equi Join
SELECT e.empno, g.grade
FROM emp e
JOIN salgrade g
ON e.sal BETWEEN g.losal AND g.hisal;
범위가 겹치면 한 사원이 여러 Grade에 Match할 수 있으므로 구간 무중복 제약을 확인한다.
Self Join의 루트 행 보존
SELECT e.ename AS employee, m.ename AS manager
FROM emp e
LEFT JOIN emp m ON m.empno = e.mgr;
같은 Table을 역할별 Alias로 구분한다. Root 사원은 mgr가 NULL이므로 Manager를 보존하려면 Left Join이 필요하다.
Cartesian Product 경고
Join 조건을 빠뜨리면 행 수는 대략 양쪽 Cardinality의 곱이 된다. 다만 CROSS JOIN이 항상 오류는 아니며 달력×상품 조합처럼 의도된 전체 조합에 사용할 수 있다. 결과 Grain과 예상 행 수를 먼저 계산한다.
시험 포인트
N개 테이블을 하나의 연결된 결과로 조인하려면 일반적으로 최소 N-1개의 독립적인 연결 조건이 필요하다. 조인 그래프가 끊겨 있으면 그 부분 사이에 Cartesian Product가 생긴다.
LIKE와 Non-Equi Join
SELECT e.ename, r.rule
FROM emp e
JOIN rule r
ON e.ename LIKE r.rule;
한 이름이 여러 패턴과 일치하면 한 사원 행이 여러 결과로 증폭된다. 조인 결과 건수는 입력 행 수가 아니라 각 행이 몇 번 매칭되는지를 세어야 한다.
구간 조인
SELECT u.customer_id,
u.usage_qty * p.unit_price AS charge
FROM usage u
JOIN price_band p
ON u.usage_time >= p.start_time
AND u.usage_time < p.end_time;
경계가 겹치면 한 사용량이 두 구간과 매칭될 수 있다. BETWEEN의 양 끝 포함과 반개방 구간의 차이를 확인한다.
Self Join의 별칭과 관리자 조회
같은 테이블의 행 사이 관계를 표현할 때 별칭을 두 개 사용한다.
SELECT e.name, m.name manager_name
FROM employee e
LEFT JOIN employee m ON m.emp_id = e.manager_id;
Self Join은 테이블을 복제하는 기능이 아니라 같은 행 집합을 서로 다른 역할로 두 번 참조하는 문법이다.
자주 틀리는 부분
- 테이블 별칭을 사용하면 컬럼 참조도 그 별칭으로 일관되게 작성한다.
- 조인 조건이 있다고 결과가 항상 입력 행 수 이하인 것은 아니다.
- Self Join은 테이블을 물리적으로 두 번 저장한다는 뜻이 아니다.
복습 문제
답을 생각한 뒤 정답과 근거를 펼쳐 보세요.
조인 후 행 수가 예상보다 늘었다면 어떤 키 특성을 확인해야 하는가?
정답과 근거
조인 키가 한쪽 또는 양쪽에서 실제로 유일한지, NULL과 중복값이 있는지 확인합니다.
급여가 등급의 최저·최고 사이인지 연결하는 조인은 어떤 유형인가?
정답과 근거
급여가 최저·최고 범위에 속하는지 연결하므로 비등가 구간 조인입니다.
사원과 부서를 조인할 때 부서번호 중복이 조인 결과 행 수에 어떤 영향을 주는가?
정답과 근거
부서번호가 부서 쪽에서 중복되면 사원 한 행이 여러 부서 행과 매칭되어 결과가 그 중복 수만큼 늘어납니다.