Search
moon
sun

13.조인 ① (내부 조인)

•
조인이 왜 필요한지 정규화와 연결해서 설명할 수 있다.
•
EQUI JOIN(등가 조인)으로 여러 테이블을 연결할 수 있다.
•
N개 테이블 조인에 최소 N-1개 조건이 필요함을 안다.
•
NON-EQUI JOIN(범위 조인)과 SELF JOIN(자기 조인)을 작성할 수 있다.

1. 조인이 왜 필요한가

1) 정규화로 나눈 것을 다시 합친다

-- EMP 에는 부서번호(DEPTNO)만 있고, 부서명(DNAME)은 DEPT 에 있다 SELECT ENAME, DEPTNO FROM EMP; -- ENAME, 20 ... 부서명을 모른다 SELECT * FROM DEPT; -- 20, RESEARCH, DALLAS -- "사원 이름과 '부서명' 을 함께 보고 싶다" → 두 테이블을 조인해야 한다
SQL
복사
⭐ 조인(JOIN) = 두 개 이상의 테이블을 연결해서 하나의 결과로 만드는 것. "ERD의 관계선" 이 실제 SQL에서는 조인 조건이 됩니다.

2) 조인 조건이 없으면? — 카티션 곱 ⭐⭐

-- ============================================================ -- 【시험용 예제】 조인 조건을 빠뜨리면 행이 폭발한다 ★★ -- ============================================================ -- ❌ WHERE 조건 없이 두 테이블을 나열하면 SELECT ENAME, DNAME FROM EMP, DEPT; -- 조인 조건이 없다! -- → EMP 14행 × DEPT 4행 = 56행 ⚠️ -- 모든 사원이 모든 부서와 억지로 짝지어진다 (SMITH-ACCOUNTING, SMITH-RESEARCH, ...) -- 이것을 '카티션 곱(Cartesian Product)' 또는 '교차 곱(CROSS JOIN)' 이라 한다. -- ✅ 조인 조건을 주면 올바르게 짝지어진다 SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; -- 관계선 = 조인 조건 (01강) -- → 14행 (각 사원이 자기 부서와만 연결)
SQL
복사
⚠️ 카티션 곱은 실무 사고의 주범입니다. 조인 조건을 빠뜨리면 오류 없이 행이 곱해져 결과가 폭발합니다.

2. EQUI JOIN — 등가 조인 ⭐⭐⭐

1) 가장 기본이 되는 조인

•
=(등호)로 두 테이블을 연결하는 조인
•
보통 한쪽의 PK와 다른 쪽의 FK를 연결한다 ( PK-FK 관계)
-- ============================================================ -- 【이해용 예제】 사원명 + 부서명 + 부서위치 -- ============================================================ SELECT EMP.ENAME AS 사원명, EMP.DEPTNO AS 부서번호, DEPT.DNAME AS 부서명, -- DEPT 테이블에서 가져옴 DEPT.LOC AS 부서위치 -- DEPT 테이블에서 가져옴 FROM EMP, DEPT -- 두 테이블을 나열 WHERE EMP.DEPTNO = DEPT.DEPTNO; -- 조인 조건 (EMP의 FK = DEPT의 PK) -- 사원명 부서번호 부서명 부서위치 -- ------ -------- ---------- -------- -- SMITH 20 RESEARCH DALLAS -- ALLEN 30 SALES CHICAGO -- CLARK 10 ACCOUNTING NEW YORK -- ... → 14건 -- -- ⚠️ 40번 부서(OPERATIONS)는 소속 사원이 없어 결과에 나오지 않는다. -- → 내부 조인(INNER JOIN)은 '양쪽에 다 있는 것만' 보여준다. (14강 OUTER 로 해결)
SQL
복사

2) 어느 컬럼으로 조인하는가

테이블
컬럼
역할
EMP
DEPTNO
외래키(FK) — 부서를 가리킴
DEPT
DEPTNO
기본키(PK) — 부서의 대표값
⭐ 조인 조건은 대부분 자식FK = 부모PK 형태입니다. 이 연결이 ERD에서 두 엔터티를 잇던 관계선입니다.

3. 테이블 별칭 ⭐⭐

1) 양쪽에 같은 컬럼명이 있으면 반드시 구분

-- ============================================================ -- 【시험용 예제】 컬럼명이 모호하면 오류 ★★ -- ============================================================ -- ❌ DEPTNO 가 EMP 에도 DEPT 에도 있어서 어느 것인지 알 수 없다 SELECT ENAME, DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; -- ORA-00918: column ambiguously defined -- → SELECT 의 DEPTNO 가 EMP 것인지 DEPT 것인지 모호하다! -- ✅ 테이블명(또는 별칭)으로 명시한다 SELECT ENAME, EMP.DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; -- → ENAME, DNAME 은 한쪽에만 있어서 생략 가능하지만, DEPTNO 는 반드시 명시
SQL
복사

2) 별칭으로 짧고 명확하게 ⭐

-- ============================================================ -- 【이해용 예제】 테이블에 별칭을 붙이면 훨씬 간결하다 -- ============================================================ SELECT E.ENAME AS 사원명, -- E = EMP E.SAL AS 급여, D.DNAME AS 부서명, -- D = DEPT D.LOC AS 근무지 FROM EMP E, -- EMP 에 별칭 E DEPT D -- DEPT 에 별칭 D WHERE E.DEPTNO = D.DEPTNO; -- 사원명 급여 부서명 근무지 -- ------ ----- ---------- -------- -- SMITH 800 RESEARCH DALLAS -- ... -- ⚠️ 별칭을 붙이면 '원래 테이블명' 은 쓸 수 없다 SELECT EMP.ENAME FROM EMP E; -- ORA-00904: "EMP"."ENAME": invalid identifier -- → 별칭 E 를 붙였으면 E.ENAME 으로만 참조해야 한다
SQL
복사
⭐ 실무 관례: 테이블 별칭은 거의 필수입니다. 조인이 복잡해질수록 별칭 없이는 읽을 수 없습니다.

4. 3개 이상 테이블 조인 ⭐

1) N개 테이블 → 최소 N-1개 조인 조건

-- ============================================================ -- 【시험용 예제】 선수 + 소속팀 + 홈구장 (테이블 3개 조인) ★ -- ============================================================ SELECT P.PLAYER_NAME AS 선수명, T.TEAM_NAME AS 소속팀, S.STADIUM_NAME AS 홈구장 FROM PLAYER P, TEAM T, STADIUM S WHERE P.TEAM_ID = T.TEAM_ID -- 조인 조건 ① PLAYER ─ TEAM AND T.STADIUM_ID = S.STADIUM_ID -- 조인 조건 ② TEAM ─ STADIUM AND P.POSITION = 'GK'; -- 일반 조회 조건 (조인 조건 아님) -- 선수명 소속팀 홈구장 -- ------- ------------ -------------- -- 김병지 포항스틸러스 포항스틸야드 -- ... -- -- ⭐ 테이블 3개 → 조인 조건 2개 (N-1 규칙) -- 조인 조건을 하나라도 빠뜨리면 카티션 곱이 발생한다.
SQL
복사
⭐ N-1 규칙: 테이블이 3개면 조인 조건 최소 2개, 4개면 3개. 05강에서 SCHEDULE+TEAM+TEAM+STADIUM 4개를 조인할 때 조건이 3개였던 것과 같습니다.

5. NON-EQUI JOIN — 범위 조인 ⭐⭐

1) = 이 아닌 조인

등호(=)로 딱 맞아떨어지지 않고, 범위(BETWEEN, >, <)로 연결하는 조인
드디어 SALGRADE(급여 등급표)를 씁니다 — a4.sql
GRADE(등급)
LOSAL(하한)
HISAL(상한)
1
700
1200
2
1201
1400
3
1401
2000
4
2001
3000
5
3001
9999
EMP.SAL(급여)과 SALGRADE.GRADE(등급)를 등호로 연결할 수 없습니다. 급여가 어느 구간에 속하는지를 따져야 하므로 범위 조인이 필요합니다.
-- ============================================================ -- 【시험용 예제】 사원의 급여가 몇 등급인지 알아내기 ★★ -- ============================================================ SELECT E.ENAME AS 사원명, E.SAL AS 급여, S.GRADE AS 급여등급 FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; -- 급여가 등급의 하한~상한 사이 (등호 아님!) -- 사원명 급여 급여등급 -- ------ ----- -------- -- SMITH 800 1 ← 800 은 700~1200 → 1등급 -- JAMES 950 1 -- ADAMS 1100 1 -- MARTIN 1250 2 ← 1250 은 1201~1400 → 2등급 -- WARD 1250 2 -- MILLER 1300 2 -- ALLEN 1600 3 ← 1600 은 1401~2000 → 3등급 -- TURNER 1500 3 -- BLAKE 2850 4 -- CLARK 2450 4 -- JONES 2975 4 -- KING 5000 5 ← 5000 은 3001~9999 → 5등급 -- SCOTT 3000 4 -- FORD 3000 4 -- → 14건 (모든 사원이 정확히 한 등급에 속함) -- -- ⭐ 핵심: BETWEEN 은 '경계값 포함' 이므로 각 급여가 정확히 하나의 등급에만 속한다. -- (등급 구간이 겹치지 않게 설계되어 있어 중복 매칭이 없다)
SQL
복사

2) EQUI vs NON-EQUI 비교

EQUI JOIN
NON-EQUI JOIN
연결 방식
= (등호)
BETWEEN > < <= >=
예
E.DEPTNO = D.DEPTNO
E.SAL BETWEEN S.LOSAL AND S.HISAL
용도
PK-FK 연결
구간·등급 매칭

6. SELF JOIN — 자기 자신과 조인 ⭐⭐⭐

1) 순환 관계를 조회하기

사원-관리자(순환 관계)를 완성합니다. EMP.MGR(관리자 사원번호)는 같은 EMP 테이블의 EMPNO 를 가리킵니다.
-- ============================================================ -- 【시험용 예제】 사원과 그 관리자의 이름을 함께 조회 ★★★ -- ============================================================ SELECT E.ENAME AS 사원, E.MGR AS "관리자 사번", M.ENAME AS 관리자명 FROM EMP E, -- E = '사원' 역할 EMP M -- M = '관리자' 역할 (같은 EMP 테이블!) WHERE E.MGR = M.EMPNO; -- 사원의 MGR = 관리자의 EMPNO -- 사원 관리자 사번 관리자명 -- ------ ---------- -------- -- SMITH 7902 FORD -- ALLEN 7698 BLAKE -- SCOTT 7566 JONES -- ADAMS 7788 SCOTT -- ... → 13건 -- -- ⚠️ KING 이 빠졌다! (14건 중 13건) -- KING 은 사장이라 MGR 이 NULL → E.MGR = M.EMPNO 를 만족하는 짝이 없다. -- → 05강에서 배운 '선택적 관계' → INNER JOIN 하면 누락된다. -- → KING 도 보이게 하려면 OUTER JOIN 이 필요하다 (14강).
SQL
복사

2) SELF JOIN의 핵심 — 별칭 2개 필수

요소
설명
같은 테이블
EMP 를 두 번 쓴다
별칭 2개
E(사원), M(관리자) — 역할을 구분 ⭐
조인 조건
E.MGR = M.EMPNO (역할이 다른 두 컬럼을 연결)
⭐ 별칭이 없으면 SELF JOIN은 불가능합니다. 같은 테이블을 구분할 방법이 없기 때문입니다. 02강에서 SCHEDULE의 TEAM을 홈팀(H)/원정팀(A)으로 두 번 조인한 것과 같은 원리입니다.

7. 조인 문법 두 가지 (맛보기)

지금까지 쓴 것은 Oracle 전통 문법입니다. ANSI 표준 문법도 있다.
-- Oracle 전통 문법 : 테이블을 콤마로 나열, 조인 조건은 WHERE 에 SELECT E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; -- ANSI 표준 문법 : JOIN ~ ON 으로 조인을 명시 (14강) SELECT E.ENAME, D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
SQL
복사
Oracle 전통 문법
ANSI 표준 문법
테이블 나열
FROM A, B
FROM A JOIN B
조인 조건
WHERE A.x = B.x
ON A.x = B.x
조인/조회 조건 구분
섞임 (WHERE에 다 있음)
분리됨 (ON=조인, WHERE=조회)
OUTER JOIN
(+) 기호
LEFT/RIGHT OUTER JOIN
표준
Oracle 전용
모든 DBMS
⭐ 두 문법은 결과가 같습니다. 시험에는 둘 다 나오므로 모두 읽을 수 있어야 합니다.

8. 출제 포인트 한눈에 정리

#
꼭 외울 것
핵심
1
조인의 목적
정규화로 나눈 테이블을 다시 합침
2
조인 조건 없으면
카티션 곱 (행이 곱해짐) ⭐
3
N개 테이블
최소 N-1개 조인 조건 ⭐
4
EQUI JOIN
= 로 연결 (보통 PK-FK)
5
컬럼 모호성
양쪽 같은 컬럼명 → 테이블명/별칭 필수 (ORA-00918)
6
별칭 사용 시
원래 테이블명 사용 불가
7
NON-EQUI JOIN
= 아닌 BETWEEN > < 로 연결 ⭐
8
NON-EQUI 대표 예
EMP.SAL BETWEEN SALGRADE.LOSAL AND HISAL
9
SELF JOIN
같은 테이블, 별칭 2개 필수 ⭐
10
SELF JOIN 예
사원-관리자 (E.MGR = M.EMPNO)
11
INNER JOIN 특성
양쪽에 다 있는 것만 (매칭 안 되면 누락)
12
KING이 누락되는 이유
MGR이 NULL → INNER JOIN에서 짝 없음 (14강 OUTER)
13
두 가지 문법
Oracle 전통(,+WHERE) / ANSI 표준(JOIN+ON)
14
두 문법의 결과
동일

9. 확인 문제

Q1. EMP(14행)와 DEPT(4행)를 조인 조건 없이 FROM EMP, DEPT 로만 조회하면 결과는 몇 행인가?
정답 보기
Q2. PLAYER, TEAM, STADIUM 세 테이블을 조인할 때 최소로 필요한 조인 조건의 개수는?
정답 보기
Q3. 다음 SQL이 ORA-00918: column ambiguously defined 오류가 나는 이유는?
SELECT ENAME, DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
SQL
복사
정답 보기
Q4. EMP 와 SALGRADE 를 조인할 때 = 이 아닌 BETWEEN 을 쓰는 이유는?
정답 보기
Q5. SELF JOIN을 할 때 반드시 필요한 것은?
정답 보기
Q6. EQUI JOIN과 NON-EQUI JOIN의 차이는?
정답 보기
Q7. 다음 SQL이 오류가 나는 이유는?
SELECT EMP.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
SQL
복사
정답 보기