SQL에서 JOIN은 두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 중요한 개념입니다.
데이터베이스에서 하나의 테이블만으로 필요한 정보를 모두 얻기 어려운 경우가 많기 때문에,
JOIN을 활용하여 여러 테이블의 데이터를 효과적으로 조합할 수 있습니다.
이번 글에서는 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN의 차이점을 쉽게 이해할 수 있도록 설명해드리겠습니다! 😊
🔹 1. JOIN이란?
JOIN은 두 개 이상의 테이블을 특정 기준(공통된 열, 보통 PK & FK)으로 연결하는 기능입니다.
일반적으로 기본키(Primary Key)와 외래키(Foreign Key) 관계를 활용하여 데이터를 조합합니다.
📌 예제 테이블
우리가 사용할 테이블은 직원 정보(employees)와 부서 정보(departments)입니다.
🔸 employees (직원 테이블)
emp_id | name | dept_id |
1 | Alice | 101 |
2 | Bob | 102 |
3 | Charlie | 103 |
4 | David | NULL |
🔸 departments (부서 테이블)
dept_id | dept_name |
101 | IT |
102 | HR |
104 | Finance |
🔹 2. INNER JOIN – 공통된 데이터만 조회
📌 INNER JOIN은 두 테이블에서 일치하는 데이터만 조회합니다.
즉, ON 조건에 맞는 데이터만 가져오고, 일치하지 않는 행은 제외됩니다.
✅ INNER JOIN 문법
SELECT e.emp_id, e.name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;
🔸 결과 (공통된 데이터만 조회됨)
emp_id | name | dept_name |
1 | Alice | IT |
2 | Bob | HR |
✔ dept_id = 103 (Charlie), NULL (David), dept_id = 104 (Finance)는 제외됨
✔ 공통된 값이 없는 데이터는 출력되지 않음
🔹 3. LEFT JOIN – 왼쪽 테이블을 기준으로 조회
📌 LEFT JOIN은 왼쪽 테이블(첫 번째 테이블)의 모든 데이터를 가져오고,
오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
✅ LEFT JOIN 문법
SELECT e.emp_id, e.name, d.dept_name
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.dept_id;
🔸 결과 (employees 테이블을 기준으로 조회됨)
emp_id | name | dept_name |
1 | Alice | IT |
2 | Bob | HR |
3 | Charlie | NULL |
4 | David | NULL |
✔ LEFT JOIN이므로 employees 테이블의 모든 데이터가 표시됨
✔ Charlie(103)와 David(NULL)는 departments에 일치하는 데이터가 없으므로 NULL 표시
🔹 4. RIGHT JOIN – 오른쪽 테이블을 기준으로 조회
📌 RIGHT JOIN은 오른쪽 테이블(두 번째 테이블)의 모든 데이터를 가져오고,
왼쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
✅ RIGHT JOIN 문법
SELECT e.emp_id, e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d
ON e.dept_id = d.dept_id;
🔸 결과 (departments 테이블을 기준으로 조회됨)
emp_id | name | dept_name |
1 | Alice | IT |
2 | Bob | HR |
NULL | NULL | Finance |
✔ RIGHT JOIN이므로 departments 테이블의 모든 데이터가 표시됨
✔ Finance(104)는 employees 테이블에 일치하는 데이터가 없으므로 NULL 표시
🔹 5. FULL JOIN – 모든 데이터 조회
📌 FULL JOIN (FULL OUTER JOIN)은 두 테이블의 모든 데이터를 가져오며,
일치하지 않는 값은 NULL로 표시합니다.
✅ FULL JOIN 문법
SELECT e.emp_id, e.name, d.dept_name
FROM employees e
FULL JOIN departments d
ON e.dept_id = d.dept_id;
🔸 결과 (모든 데이터가 포함됨)
emp_id | name | dept_name |
1 | Alice | IT |
2 | Bob | HR |
3 | Charlie | NULL |
4 | David | NULL |
NULL | NULL | Finance |
✔ employees와 departments 테이블의 모든 데이터가 표시됨
✔ 일치하지 않는 데이터는 NULL로 표시됨
🔹 6. JOIN 비교 요약 정리
JOIN 종류 | 기준테이블 | 일치하는 데이터 | 일치하지 않는 데이터 |
INNER JOIN | 양쪽 테이블 | ✅ 포함 | ❌ 제외 |
LEFT JOIN | 왼쪽 테이블 | ✅ 포함 | 🔹 왼쪽 테이블 유지, 오른쪽 NULL |
RIGHT JOIN | 오른쪽 테이블 | ✅ 포함 | 🔹 오른쪽 테이블 유지, 왼쪽 NULL |
FULL JOIN | 양쪽 테이블 | ✅ 포함 | 🔹 왼쪽 & 오른쪽 모두 NULL 표시 |
🔹 7. JOIN을 활용한 실전 예제
✅ 부서별 직원 수를 구하는 예제 (LEFT JOIN + GROUP BY)
SELECT d.dept_name, COUNT(e.emp_id) AS employee_count
FROM departments d
LEFT JOIN employees e
ON d.dept_id = e.dept_id
GROUP BY d.dept_name;
- LEFT JOIN을 사용하여 부서를 기준으로 직원 수를 계산
- 직원이 없는 부서도 포함되도록 LEFT JOIN 사용
📌 핵심 정리
✔ INNER JOIN → 공통된 데이터만 조회
✔ LEFT JOIN → 왼쪽(첫 번째) 테이블 기준, 일치하지 않는 데이터는 NULL
✔ RIGHT JOIN → 오른쪽(두 번째) 테이블 기준, 일치하지 않는 데이터는 NULL
✔ FULL JOIN → 양쪽 테이블의 모든 데이터를 가져오고, 일치하지 않으면 NULL
SQL 실습을 통해 JOIN을 직접 사용해 보세요! 😊
'개발 > SQL' 카테고리의 다른 글
윈도우 함수(Window Function) 기초: RANK(), DENSE_RANK(), ROW_NUMBER() (2) | 2025.03.18 |
---|---|
서브쿼리(Subquery) 활용법: EXISTS, IN, ANY, ALL (6) | 2025.03.17 |
HAVING과 WHERE 차이: 그룹 함수와 함께 쓰이는 HAVING의 활용 (0) | 2025.03.15 |
WHERE 절 & 조건문 활용: BETWEEN, IN, LIKE, IS NULL 등 (0) | 2025.03.07 |
DML과 DDL 차이점: SELECT, INSERT, UPDATE, DELETE vs CREATE, ALTER, DROP (0) | 2025.03.06 |