MySQL JOIN & UNION

stone tiger·2025년 2월 5일

MySQL

목록 보기
7/11

MySQL에서 JOINUNION둘 이상의 테이블을 결합할 때 사용하는 방법이지만, 동작 방식이 다르다.

  • JOIN"가로로" 데이터를 병합 (컬럼 확장)
  • UNION"세로로" 데이터를 병합 (행 추가)

이제 하나씩 자세히 알아보자!


📌 1. JOIN (가로 병합, 두 테이블의 데이터 연결)

JOIN두 개 이상의 테이블을 "공통된 키(Column)"를 기준으로 연결할 때 사용된다.

✅ 1.1 INNER JOIN (교집합)

  • 두 테이블에서 공통된 값이 있는 행만 반환한다.

📌 예제

SELECT employees.id, employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

employees.department_iddepartments.id일치하는 경우만 가져옴.

결과 예시
| id | name | department_name |
|----|-------|----------------|
| 1 | Alice | IT |
| 2 | Bob | HR |

📌 특징
공통된 값이 있는 데이터만 반환 (매칭 안 되면 제외)
✅ 가장 일반적인 JOIN 방식


✅ 1.2 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로 표시


✅ 1.3 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로 표시


✅ 1.4 FULL OUTER JOIN (양쪽 모두 포함, MySQL에서 직접 지원 X)

  • 왼쪽과 오른쪽 모두 포함하고, 일치하는 값이 없으면 NULL로 표시
  • MySQL에서는 직접 지원하지 않으며, 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;

✅ 1.5 CROSS JOIN (모든 조합 생성)

  • 두 테이블의 모든 행을 조합 (곱집합)

📌 예제

SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;

employees가 3명, departments가 2개라면 → 결과는 3 × 2 = 6개 행

📌 특징
✅ 모든 조합을 가져오므로 데이터가 많아질 수 있음


📌 2. UNION (세로 병합, 행 추가)

  • JOIN가로로 합치는 것이라면, UNION세로로 합친다.
  • 두 개의 쿼리 결과를 하나로 합쳐서 반환
  • 열(Column) 개수와 데이터 타입이 일치해야 함!

✅ 2.1 UNION (중복 제거)

SELECT name FROM employees
UNION
SELECT name FROM customers;

결과: employeescustomers 테이블에서 중복 없이 name 컬럼을 합친다.


✅ 2.2 UNION ALL (중복 포함)

SELECT name FROM employees
UNION ALL
SELECT name FROM customers;

결과: 중복도 포함하여 모든 데이터를 가져온다.

📌 UNION vs UNION ALL 차이점
| 기능 | UNION | UNION ALL |
|------|---------|------------|
| 중복 제거 | ✅ (자동) | ❌ (그대로 유지) |
| 성능 | 느림 (중복 검사 필요) | 빠름 |
| 사용 예 | 중복 제거가 필요한 경우 | 단순 합칠 때 |


📌 JOIN vs UNION 비교 정리

비교 항목JOINUNION
데이터 결합 방식"가로로" 합침 (컬럼 확장)"세로로" 합침 (행 추가)
조건 필요 여부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: 중복 포함 (더 빠름)

0개의 댓글