현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

조인 기본: Equi·Non-Equi·Self

여러 테이블을 관계 조건으로 연결하고 Equi·Non-Equi·Self Join의 결과 건수를 예측한다.

예상 읽기 6

핵심 요약

여러 테이블을 관계 조건으로 연결하고 Equi·Non-Equi·Self Join의 결과 건수를 예측한다.

핵심 질문

  1. 조인 기본: Equi·Non-Equi·Self에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • 조인 조건과 일반 필터 조건을 구분한다.
  • Equi·Non-Equi·Self Join의 사용 사례를 설명한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
각 입력의 Key 확인 → 조인 조건 → 일치·미일치 행 규칙 → 중복·NULL 결과 검증

핵심 내용

조인은 서로 다른 행 집합을 관련 컬럼으로 연결한다. 조인 조건이 빠지면 두 집합의 모든 조합인 Cartesian Product가 만들어질 수 있다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON d.deptno = e.deptno;

= 조건의 Equi Join이 가장 흔하다. 구간 등급표처럼 BETWEEN, <, >로 연결하면 Non-Equi Join이다. Self Join은 같은 테이블에 서로 다른 별칭을 주어 상사-부하처럼 행 사이 관계를 표현한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT e.ename, r.rule
FROM emp e
JOIN rule r
  ON e.ename LIKE r.rule;

한 이름이 여러 패턴과 일치하면 한 사원 행이 여러 결과로 증폭된다. 조인 결과 건수는 입력 행 수가 아니라 각 행이 몇 번 매칭되는지를 세어야 한다.

구간 조인

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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

같은 테이블의 행 사이 관계를 표현할 때 별칭을 두 개 사용한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT e.name, m.name manager_name
FROM employee e
LEFT JOIN employee m ON m.emp_id = e.manager_id;

Self Join은 테이블을 복제하는 기능이 아니라 같은 행 집합을 서로 다른 역할로 두 번 참조하는 문법이다.

작은 데이터로 Join 결과 계산하기

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
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

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT e.empno, g.grade
FROM   emp e
JOIN   salgrade g
  ON e.sal BETWEEN g.losal AND g.hisal;

범위가 겹치면 한 사원이 여러 Grade에 Match할 수 있으므로 구간 무중복 제약을 확인한다.

Self Join

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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과 예상 행 수를 먼저 계산한다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. 조인 후 행 수가 예상보다 늘었다면 어떤 키 특성을 확인해야 하는가?
  2. 급여가 등급의 최저·최고 사이인지 연결하는 조인은 어떤 유형인가?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?