한양과학기술고등학교

에듀테크 프로젝트 대시보드

SQL 조인 (JOIN)

SQL 조인 — 흩어진 두 표를 한 표로

데이터베이스는 중복을 줄이려고 정보를 여러 표로 쪼개서 저장한다. 학생 정보와 동아리 정보가 따로 있을 때, "학생별 동아리 목록"을 보려면 두 표를 공통 열(키)로 이어 붙여야 한다. 그 연결 규칙이 JOIN이다.

한 줄 요약: 조인은 "왼쪽 표의 각 행을, 조건이 맞는 오른쪽 행과 짝지어라"이다. 짝이 없을 때 그 행을 버릴지(INNER), NULL로 채워서 남길지(OUTER)가 조인 종류를 가른다.

1. 재료가 되는 두 표

학생 4명, 동아리 가입 기록 4건. 가입 기록의 student_id가 students.id를 가리킨다(외래 키). 눈여겨볼 점 두 가지 — 박도윤·최지우는 아직 가입 기록이 없고, 가입 기록 중 student_id = 5는 존재하지 않는 학생을 가리키는 고아 행이다.

students (왼쪽 표)
idname
1김민준
2이서연
3박도윤
4최지우
club_members (오른쪽 표)
student_idclub
1로봇
1밴드
2미술
5코딩

2. 직접 해보기 — 조인 종류를 바꿔 결과 보기

조인 조건은 students.id = club_members.student_id로 고정. 버튼을 눌러 각 조인이 어떤 행을 유지하고, 어떤 칸을 NULL로 채우는지 확인해 보자.


    
students
idname
club_members
student_idclub
결과 집합
idnamestudent_idclub

3. 종류별 한눈 정리

조인유지하는 행짝이 없으면쓰는 상황
INNER양쪽 다 짝이 있는 행만버린다"동아리에 실제로 가입한 학생만"
LEFT (OUTER)왼쪽 전부 + 짝 있으면 오른쪽오른쪽을 NULL로"모든 학생, 없으면 동아리 빈칸"
RIGHT (OUTER)오른쪽 전부 + 짝 있으면 왼쪽왼쪽을 NULL로"모든 가입 기록, 고아 행도 확인"
FULL OUTER양쪽 전부없는 쪽을 NULL로"양쪽 어디에도 안 맞는 데이터 찾기"
CROSS모든 조합 (곱집합)조건 자체가 없음"모든 요일 × 모든 교시" 같은 격자 생성
LEFT = RIGHT 뒤집기: A LEFT JOIN B 와 B RIGHT JOIN A 는 완전히 같다. 그래서 실무에서는 헷갈리지 않게 거의 LEFT JOIN만 쓰고 RIGHT는 잘 안 쓴다.

4. "짝이 없는 행"만 뽑기 — 안티 조인

LEFT JOIN 후 WHERE 오른쪽_키 IS NULL 로 거르면, 짝이 하나도 없는 왼쪽 행만 남는다. "동아리에 아직 안 든 학생 찾기"에 자주 쓴다.

-- 어느 동아리에도 가입하지 않은 학생
SELECT s.id, s.name
FROM students s
LEFT JOIN club_members c ON s.id = c.student_id
WHERE c.student_id IS NULL;
-- 결과: 3 박도윤 / 4 최지우

5. 자주 하는 실수