•
조인이 왜 필요한지 정규화와 연결해서 설명할 수 있다.
•
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, >, <)로 연결하는 조인
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
복사
정답 보기







