조인 기본: Equi·Non-Equi·Self
여러 테이블을 관계 조건으로 연결하고 Equi·Non-Equi·Self Join의 결과 건수를 예측한다.
핵심 요약
여러 테이블을 관계 조건으로 연결하고 Equi·Non-Equi·Self Join의 결과 건수를 예측한다.
핵심 질문
- 조인 기본: Equi·Non-Equi·Self에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
- 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
- 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
- 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?
학습 목표
- 조인 조건과 일반 필터 조건을 구분한다.
- 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 조인은 자식 행이 부모 한 건과 매칭되지만, 조인 컬럼이 유일하지 않으면 행이 증폭될 수 있다.
흔한 오해와 주의점
- 테이블 별칭을 사용하면 컬럼 참조도 그 별칭으로 일관되게 작성한다.
- 조인 조건이 있다고 결과가 항상 입력 행 수 이하인 것은 아니다.
- Self Join은 테이블을 물리적으로 두 번 저장한다는 뜻이 아니다.
문항 풀이 보강: 조인 결과 건수와 관계 연산
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은 테이블을 복제하는 기능이 아니라 같은 행 집합을 서로 다른 역할로 두 번 참조하는 문법이다.
작은 데이터로 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·3도 남고 DEPT Column은 NULL이다.
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과 예상 행 수를 먼저 계산한다.
결과를 검증하는 순서
- 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
- 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
- NULL 비교가
TRUE,FALSE,UNKNOWN중 무엇인지 구분합니다. - 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
- 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.
실무와 시험에서 함께 확인할 항목
ORDER BY가 없다면 결과 순서를 가정하지 않습니다.- 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
- 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
- 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.
마지막 점검
- 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
- NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.- 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.
복습 문제
- 조인 후 행 수가 예상보다 늘었다면 어떤 키 특성을 확인해야 하는가?
- 급여가 등급의 최저·최고 사이인지 연결하는 조인은 어떤 유형인가?
- 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
- NULL이 포함될 때 결과가 달라지는 지점은 어디인가?