조인(JOIN)이란 두 개 이상의 테이블을 공통된 컬럼을 기준으로 묶어 하나의 결과로 만드는 SQL 연산이다. 보통은 외래 키(Foreign Key) 관계를 기반으로 두 테이블 간의 관계를 정의하고 이를 통해 유의미한 데이터를 결합해 사용할 수 있다.
| 조인 종류 | 의미 | 기준 테이블 기준 | 결과 포함 범위 |
|---|---|---|---|
| INNER JOIN | 교집합 (양쪽에 모두 있는 데이터만) | 기준 상관 없음 | 양쪽 모두 일치하는 행만 |
| LEFT OUTER JOIN | 기준 테이블 + 매칭되는 행 (없으면 NULL) | 왼쪽 테이블 | 왼쪽 테이블 전체 + 일치 데이터 |
| RIGHT OUTER JOIN | 기준 테이블 + 매칭되는 행 (없으면 NULL) | 오른쪽 테이블 | 오른쪽 테이블 전체 + 일치 데이터 |
| FULL OUTER JOIN | 양쪽 테이블 모두 포함 | 양쪽 다 | 모든 행 포함 + NULL 보완 |
OUTER는 생략 가능하다. 예: LEFT JOIN, RIGHT JOIN
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
| student_id | score |
|---|---|
| 1 | 85 |
| 2 | 92 |
| 4 | 78 |
SELECT *
FROM students s
INNER JOIN scores sc
ON s.id = sc.student_id;
결과 테이블
| id | name | student_id | score |
|---|---|---|---|
| 1 | Alice | 1 | 85 |
| 2 | Bob | 2 | 92 |
양쪽 테이블 모두에 매칭되는 데이터만 출력됨. (id = student_id)
조인 구조 이미지
SELECT *
FROM students s
LEFT JOIN scores sc
ON s.id = sc.student_id;
결과 테이블
| id | name | student_id | score |
|---|---|---|---|
| 1 | Alice | 1 | 85 |
| 2 | Bob | 2 | 92 |
| 3 | Charlie | NULL | NULL |
students 기준이므로 왼쪽 테이블 전체 + 매칭 안 되는 오른쪽 값은 NULL.
조인 구조 이미지
SELECT *
FROM students s
RIGHT JOIN scores sc
ON s.id = sc.student_id;
결과 테이블
| id | name | student_id | score |
|---|---|---|---|
| 1 | Alice | 1 | 85 |
| 2 | Bob | 2 | 92 |
| NULL | NULL | 4 | 78 |
scores 기준이므로 오른쪽 테이블 전체 + 매칭 안 되는 왼쪽 값은 NULL.
조인 구조 이미지
SELECT *
FROM students s
FULL OUTER JOIN scores sc
ON s.id = sc.student_id;
MySQL은 FULL OUTER JOIN을 직접 지원하지 않기 때문에 대안으로 UNION을 사용한다.
SELECT *
FROM students s
LEFT JOIN scores sc ON s.id = sc.student_id
UNION
SELECT *
FROM students s
RIGHT JOIN scores sc ON s.id = sc.student_id;
결과 테이블
| id | name | student_id | score |
|---|---|---|---|
| 1 | Alice | 1 | 85 |
| 2 | Bob | 2 | 92 |
| 3 | Charlie | NULL | NULL |
| NULL | NULL | 4 | 78 |
양쪽 테이블 전체 포함 + 매칭 안 된 부분은 NULL로 표시됨.
조인 구조 이미지
여러 테이블을 조인할 때는 기준이 되는 테이블을 정하고 그에 따라 차례대로 조인을 이어 나가는 방식으로 설계해야 한다. 테이블 간 관계를 명확하게 파악한 뒤 JOIN 조건을 적절히 설정하면 원하는 데이터를 하나의 결과로 효과적으로 조회할 수 있다. 이 과정에서 INNER JOIN, LEFT JOIN을 혼용하여 원하는 범위의 데이터를 유연하게 추출할 수 있다는 점이 인상 깊었다. 특히 세 개 이상의 테이블을 조인할 때는 중간 테이블이 누락되면 전체 데이터가 끊길 수 있으므로 항상 중간 결과를 출력해보며 디버깅하는 습관이 중요하다는 걸 배웠다.
또한 가독성을 위해 별칭을 사용하고 JOIN 순서를 논리적으로 구성하는 것이 유지보수와 협업에 큰 도움이 된다는 것을 느꼈다. JOIN은 단순한 테이블 결합을 넘어서 관계형 데이터 모델의 강력함을 실감할 수 있는 도구임을 다시 한 번 체감했다.
참고