10강 / 20강
관계형 데이터베이스 — 표와 표를 잇는 열쇠
중복을 없애는 가장 우아한 방법
학생들의 과목별 성적을 저장하려고 합니다. 표 하나에 다 넣으면 안 될까요? 해 봅시다.
😖 표 하나에 전부 욱여넣기
| 학번 | 이름 | 전화번호 | 과목 | 점수 |
|---|---|---|---|---|
| 1001 | 김민준 | 010-1111-2222 | 수학 | 95 |
| 1001 | 김민준 | 010-1111-2222 | 과학 | 88 |
| 1001 | 김민준 | 010-1111-2222 | 영어 | 91 |
| 1002 | 이서연 | 010-3333-4444 | 수학 | 78 |
보이시나요? "김민준"과 그의 전화번호가 세 번씩 반복됩니다. 문제는 단순한 낭비가 아니에요.
😱 수정 이상
민준이가 전화번호를 바꾸면 세 줄을 모두 고쳐야 합니다. 하나라도 놓치면 데이터가 서로 모순됩니다.
😱 삭제 이상
민준이의 성적을 모두 지우면 그의 전화번호까지 세상에서 사라집니다.
😱 삽입 이상
아직 시험을 안 본 신입생은 표에 넣을 방법이 없습니다. 과목과 점수 칸이 비니까요.
학생 표 — 사람 정보는 여기 한 번만
| 학번 🔑 | 이름 | 전화번호 |
|---|---|---|
| 1001 | 김민준 | 010-1111-2222 |
| 1002 | 이서연 | 010-3333-4444 |
🔑
학번으로 연결
학번으로 연결
성적 표 — 점수만
| 학번 | 과목 | 점수 |
|---|---|---|
| 1001 | 수학 | 95 |
| 1001 | 과학 | 88 |
| 1001 | 영어 | 91 |
| 1002 | 수학 | 78 |
기본키 · PRIMARY KEY 그 표에서 한 줄을 유일하게 가리키는 칸.
학생 표의
학번. 중복 불가, 빈칸 불가.외래키 · FOREIGN KEY 다른 표의 기본키를 가리키는 칸.
성적 표의
학번. "이 점수는 저 학생의 것"이라는 화살표입니다.흩어진 표를 다시 합치기 — JOIN
표를 나눴으니 "민준이가 수학에서 몇 점?"을 알려면 두 표를 다시 이어 봐야 합니다. 그 명령이 JOIN이에요. 관계형 데이터베이스의 심장입니다.
표를 나누고(정규화), 다시 잇고(JOIN).
Python
브라우저에서 실행
🎮 JOIN 실험실 — 조건 하나로 결과가 완전히 달라집니다
두 표를 INNER · LEFT · 조건 없음 세 가지 방법으로 이어 보세요. 성적이 없는 학생은 어떻게 되나요? ON 조건을 빠뜨리면 몇 줄이 나오나요?
🤔 확인 문제
성적 표의
학번 칸처럼, 다른 표의 기본키를 가리키는 칸을 무엇이라 부를까요?해설 외래키입니다. '남의 표(외래)에 있는 열쇠를 가리킨다'고 외우면 쉬워요. 이 화살표들이 모여 '관계'를 만듭니다.