MySQL에서 JOIN과 UNION은 둘 이상의 테이블을 결합할 때 사용하는 방법이지만, 동작 방식이 다르다.
JOIN → "가로로" 데이터를 병합 (컬럼 확장) UNION → "세로로" 데이터를 병합 (행 추가) 이제 하나씩 자세히 알아보자!
JOIN (가로 병합, 두 테이블의 데이터 연결)JOIN은 두 개 이상의 테이블을 "공통된 키(Column)"를 기준으로 연결할 때 사용된다.
INNER JOIN (교집합)SELECT employees.id, employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
✔ employees.department_id와 departments.id가 일치하는 경우만 가져옴.
✔ 결과 예시
| id | name | department_name |
|----|-------|----------------|
| 1 | Alice | IT |
| 2 | Bob | HR |
📌 특징
✅ 공통된 값이 있는 데이터만 반환 (매칭 안 되면 제외)
✅ 가장 일반적인 JOIN 방식
LEFT JOIN (왼쪽 테이블 기준, 공통값 없는 것도 포함)employees)의 모든 데이터를 가져오고, 오른쪽 테이블(departments)에서 일치하는 데이터만 포함 NULL 처리 SELECT employees.id, employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
✔ 결과 예시
| id | name | department_name |
|----|-------|----------------|
| 1 | Alice | IT |
| 2 | Bob | HR |
| 3 | Charlie | NULL | ❌ (부서 없음)
📌 특징
✅ 왼쪽 테이블의 모든 행 유지
✅ 오른쪽 테이블에 값이 없으면 NULL로 표시
RIGHT JOIN (오른쪽 테이블 기준)departments)의 모든 데이터를 가져오고, 왼쪽 테이블(employees)에서 일치하는 데이터만 포함 SELECT employees.id, employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
✔ 결과 예시
| id | name | department_name |
|----|-------|----------------|
| 1 | Alice | IT |
| 2 | Bob | HR |
| NULL | NULL | Finance | ❌ (해당 부서에 직원 없음)
📌 특징
✅ 오른쪽 테이블의 모든 행 유지
✅ 왼쪽 테이블에 값이 없으면 NULL로 표시
FULL OUTER JOIN (양쪽 모두 포함, MySQL에서 직접 지원 X)NULL로 표시 UNION을 사용하여 구현 가능 SELECT employees.id, employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
UNION
SELECT employees.id, employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
CROSS JOIN (모든 조합 생성)SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
✔ employees가 3명, departments가 2개라면 → 결과는 3 × 2 = 6개 행
📌 특징
✅ 모든 조합을 가져오므로 데이터가 많아질 수 있음
UNION (세로 병합, 행 추가)JOIN이 가로로 합치는 것이라면, UNION은 세로로 합친다. UNION (중복 제거)SELECT name FROM employees
UNION
SELECT name FROM customers;
✔ 결과: employees와 customers 테이블에서 중복 없이 name 컬럼을 합친다.
UNION ALL (중복 포함)SELECT name FROM employees
UNION ALL
SELECT name FROM customers;
✔ 결과: 중복도 포함하여 모든 데이터를 가져온다.
📌 UNION vs UNION ALL 차이점
| 기능 | UNION | UNION ALL |
|------|---------|------------|
| 중복 제거 | ✅ (자동) | ❌ (그대로 유지) |
| 성능 | 느림 (중복 검사 필요) | 빠름 |
| 사용 예 | 중복 제거가 필요한 경우 | 단순 합칠 때 |
JOIN vs UNION 비교 정리| 비교 항목 | JOIN | UNION |
|---|---|---|
| 데이터 결합 방식 | "가로로" 합침 (컬럼 확장) | "세로로" 합침 (행 추가) |
| 조건 필요 여부 | ON 조건 필요 (INNER JOIN, LEFT JOIN 등) | 필요 없음 |
| 데이터 구조 | 다른 테이블 연결 (공통 키 필요) | 같은 구조의 테이블 필요 |
| 중복 데이터 | 없음 (JOIN 방식에 따라 다름) | UNION은 중복 제거, UNION ALL은 유지 |
| 사용 예시 | 직원 + 부서 정보 합치기 | 직원과 고객의 이름을 하나의 리스트로 만들기 |
JOIN은 "가로 병합" (두 테이블을 키로 연결)
INNER JOIN: 공통 값 있는 것만 LEFT JOIN: 왼쪽은 모두 유지, 오른쪽은 NULL RIGHT JOIN: 오른쪽은 모두 유지, 왼쪽은 NULL FULL OUTER JOIN: 양쪽 모두 포함 (MySQL 직접 지원 X, UNION으로 구현) CROSS JOIN: 모든 조합 반환 UNION은 "세로 병합" (두 쿼리 결과를 합침)
UNION: 중복 제거 UNION ALL: 중복 포함 (더 빠름)