모델의 관계가 조인 결과 행 수에 어떻게 나타나는지, 선택 관계와 OUTER JOIN, 계층형 데이터 모델과 상호배타적 관계를 기출 중심으로 익힙니다.
가끔기출 11회분 중 3문항
학습 목표
모델의 관계가 조인 결과 행 수에 어떻게 나타나는지, 선택 관계와 OUTER JOIN, 계층형 데이터 모델과 상호배타적 관계를 기출 중심으로 익힙니다.
01
모델의 관계와 조인 결과
데이터 모델의 관계는 물리 모델에서 외래키(FK)로 구현되고, 흩어진 데이터를 다시 합쳐 볼 때는 그 관계를 따라 조인합니다. 정규화로 테이블을 나눌수록 조회할 때 조인이 필요해집니다.
조인 결과 행 수는 실제 데이터가 몇 번 매칭되는지로 정해집니다. 1:M 관계에서 1쪽 한 행은 M쪽에 매칭되는 행 수만큼 반복해서 나타납니다. ERD의 선 하나가 결과 한 행을 뜻하지 않습니다.
ERD 관계를 결과 행으로 펼치기1:N JOIN에서 왜 1쪽 행이 반복될까요?
JOIN RESULT
고객 · 1
C01
김민지
+
주문 · N
O101
C01
O102
C01
→
INNER JOIN 결과 · 2행
고객
이름
주문
C01
김민지
O101
C01
김민지
O102
핵심고객 한 행이 주문 두 행과 매칭되므로 결과에서는 고객 정보가 두 번 나타납니다.
모델의 관계가 조인 결과에 미치는 영향
모델 상황
조인 결과에서 확인할 점
1:M 관계
1쪽 한 행이 M쪽의 매칭 행 수만큼 반복될 수 있음
M:N 관계
관계 엔터티를 사이에 두고 두 번 조인하며 행 조합이 늘어날 수 있음
선택 관계
외래키가 NULL이면 내부 조인에서 해당 행이 제외될 수 있음
잘못된 조인 조건
관계 키를 빠뜨리면 카테시안 곱이나 예상보다 많은 행이 발생
02
선택 관계와 OUTER JOIN
사원이 부서에 반드시 속하면 필수 관계이고 FK에 NOT NULL을 둡니다. 부서 없는 사원이 있을 수 있으면 선택 관계이고 FK가 NULL일 수 있습니다.
FK가 NULL인 행은 어떤 부서와도 같지 않으므로 INNER JOIN에서는 빠집니다. 그 행도 결과에 남기려면 사원 쪽을 기준으로 LEFT OUTER JOIN을 쓰고, 부서 쪽 열은 NULL로 채워집니다.
TABLE예시 — DEPT 3행3행
DEPT_ID
DEPT_NAME
D1
영업
D2
개발
D3
총무
FK가 NULL인 사원 최
EMP 4행
NAME
DEPT_ID
김
D1
이
D1
박
D2
최
NULL
INNER JOIN→최 빠짐
INNER JOIN — 3행
NAME
DEPT_NAME
김
영업
이
영업
박
개발
LEFT OUTER→최 남음
EMP LEFT OUTER JOIN DEPT — 4행
NAME
DEPT_NAME
김
영업
이
영업
박
개발
최
NULL
D1 영업은 김·이 두 행에 반복되고, 사원이 없는 D3 총무는 두 결과 모두에 나오지 않습니다.
참고로 DEPT LEFT OUTER JOIN EMP처럼 부서 쪽을 기준으로 하면 사원이 없는 D3 총무가 사원 열 NULL로 남습니다. 어느 쪽을 남길지는 기준 테이블이 정합니다.
03
M:N 관계와 조인 조건 수
M:N 관계는 물리 모델에서 그대로 만들 수 없어서 연결 엔터티(예: 수강)로 풀어 1:M 두 개로 만듭니다. 그래서 학생과 과목을 함께 보려면 연결 테이블을 거쳐 두 번 조인합니다.
테이블 N개를 카테시안 곱 없이 조인하려면 조인 조건이 최소 N − 1개 필요합니다. 조건을 빠뜨리면 두 테이블의 모든 행 조합이 나와 행 수가 곱이 됩니다.
M:N 해소
학생 ↔ 과목
학생 (1)→
수강 (M) — 연결 엔터티→
과목 (1)
학생 1 : M 수강, 과목 1 : M 수강으로 바뀝니다.
-- 테이블 3개 → 조인 조건 2개SELECT S.NAME, C.TITLE
FROM STUDENT S
JOIN ENROLL E ON S.STU_ID = E.STU_ID
JOIN COURSE C ON E.COURSE_ID = C.COURSE_ID;
DEPT 3행 × EMP 4행 조인 결과
조인 방식
결과 행 수
이유
조건 없음 (CROSS JOIN)
12
3 × 4 모든 조합
E.DEPT_ID = D.DEPT_ID INNER
3
최(NULL)는 매칭 없음
EMP 기준 LEFT OUTER
4
최도 남음
04
계층형 데이터 모델과 상호배타적 관계
계층형 데이터 모델은 사원과 관리자처럼 한 엔터티 안에서 자기 자신을 참조하는 관계입니다. 사원 테이블의 관리자번호가 같은 테이블의 사원번호를 가리키며, 조회할 때는 같은 테이블을 별칭 두 개로 붙이는 셀프 조인이나 계층형 질의(CONNECT BY)를 씁니다.
상호배타적 관계(Arc 관계)는 자식 엔터티가 두 개 이상의 부모 후보 중 어느 한 시점에 하나의 부모와만 관계를 맺는 구조입니다. 차량이 법인 소유이거나 개인 소유 중 하나인 경우가 대표적이며, 한쪽 FK를 채우면 다른 쪽 FK는 NULL이어야 합니다. 부서–사원, 고객–주문 같은 일반 1:M 관계와 구분하는 문제가 나옵니다.
개념 정리두 가지 특별한 관계
자기참조
계층형 데이터 모델
같은 엔터티의 다른 인스턴스를 참조합니다(사원 → 관리자). 셀프 조인으로 조회합니다.
Arc
상호배타적 관계
여러 부모 중 하나와만 관계를 맺습니다(법인차량·개인차량). 나머지 FK는 NULL입니다.
TABLE상호배타적 관계 — 차량의 소유자3행
VEHICLE_ID
CORP_ID
PERSON_ID
판정
V1
C1
NULL
법인 소유 — O
V2
NULL
P7
개인 소유 — O
V3
C1
P7
두 부모 동시 — X
보충 실습여기부터는 테이블을 직접 만들어 보는 긴 SQL 실습입니다. 처음 공부할 때는 건너뛰고, 위 내용을 이해한 뒤 돌아와도 됩니다.
05
SQL에서 외래키와 조인으로 연결하기
보충 실습
논리 모델의 고객·문의 관계는 데이터베이스에서 외래키 제약으로 표현합니다. 아래 Oracle SQL은 문의마다 고객이 한 명 있어야 한다는 규칙을 CUSTOMER_ID NUMBER NOT NULL과 FOREIGN KEY로 구현한 예입니다.
두 테이블을 조회할 때는 JOIN ... ON으로 공통 키를 비교합니다. 고객 11번은 문의 두 건과 연결되므로 결과에 두 행으로 나타나고, 문의가 없는 고객(13번 서아)은 INNER JOIN 결과에 포함되지 않습니다.
CREATETABLECUSTOMER(
CUSTOMER_ID NUMBERPRIMARYKEY,
CUSTOMER_NAME VARCHAR2(30CHAR)NOTNULL);CREATETABLESUPPORT_TICKET(
TICKET_ID NUMBERPRIMARYKEY,
CUSTOMER_ID NUMBERNOTNULL,
RECEIVED_AT DATENOTNULL,CONSTRAINT FK_SUPPORT_TICKET_CUSTOMER
FOREIGNKEY(CUSTOMER_ID)REFERENCESCUSTOMER(CUSTOMER_ID));INSERTINTO CUSTOMER VALUES(11,'하린');INSERTINTO CUSTOMER VALUES(12,'도윤');INSERTINTO CUSTOMER VALUES(13,'서아');INSERTINTO SUPPORT_TICKET VALUES(501,11,DATE'2026-09-12');INSERTINTO SUPPORT_TICKET VALUES(502,11,DATE'2026-09-14');INSERTINTO SUPPORT_TICKET VALUES(503,12,DATE'2026-09-18');SELECT C.CUSTOMER_NAME,
T.TICKET_ID,TO_CHAR(T.RECEIVED_AT,'YYYY-MM-DD')AS RECEIVED_DATE
FROM CUSTOMER C
JOIN SUPPORT_TICKET T
ON C.CUSTOMER_ID = T.CUSTOMER_ID
ORDERBY T.TICKET_ID;