코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

SQL Full Join

SQL FULL JOIN: 두 테이블의 모든 데이터를 반환하고, 일치하지 않는 데이터는 NULL로 처리

SQL FULL JOIN(또는 FULL OUTER JOIN)은 두 개의 테이블을 결합하여 두 테이블의 모든 행을 반환하고, 일치하는 데이터가 없는 경우 NULL을 반환하는 JOIN입니다. FULL JOINLEFT JOINRIGHT JOIN의 결합으로, 왼쪽 테이블과 오른쪽 테이블 모두에서 일치하지 않는 행도 포함됩니다.

1. 기본 FULL JOIN 문법

SELECT 열이름
FROM 테이블1
FULL JOIN 테이블2 ON 테이블1.열 = 테이블2.열;

  • FULL JOIN: 두 테이블의 모든 행을 반환합니다. 일치하지 않는 데이터는 NULL로 반환됩니다.
  • ON: 두 테이블을 연결하는 기준을 설정합니다. 일반적으로 두 테이블 간의 외래 키와 기본 키를 비교합니다.

2. SQL FULL JOIN 예제

2.1 기본 FULL JOIN

다음은 employees 테이블과 departments 테이블을 FULL JOIN으로 결합하여 모든 직원과 부서를 조회하는 예제입니다.

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

이 쿼리는 두 테이블의 모든 행을 반환하고, 일치하지 않는 경우 NULL로 처리합니다.

결과 예시:

name department_name
John Sales
Jane HR
NULL Marketing
Bob NULL

3. FULL JOIN과 조건 사용

FULL JOIN과 WHERE 절을 결합하여 데이터를 필터링할 수 있습니다.

예제: 부서 또는 직원 정보가 없는 행 조회

다음은 부서가 없는 직원 또는 직원이 없는 부서를 조회하는 예제입니다.

SELECT employees.name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id
WHERE employees.name IS NULL OR departments.department_name IS NULL;

이 쿼리는 두 테이블에서 일치하지 않는 데이터(즉, NULL 값이 있는 행)를 조회합니다.

결과 예시:

name department_name
NULL Marketing
Bob NULL

4. FULL JOIN과 집계 함수 결합

FULL JOIN을 사용하면 두 테이블의 데이터를 모두 결합한 후, 집계 함수를 적용하여 통계를 계산할 수 있습니다.

예제: 부서별 직원 수 계산 (직원이 없는 부서 포함)

SELECT departments.department_name, COUNT(employees.id) AS employee_count
FROM employees
FULL JOIN departments ON employees.department_id = departments.id
GROUP BY departments.department_name;

이 쿼리는 각 부서의 직원 수를 계산하며, 직원이 없는 부서도 포함됩니다.

결과 예시:

department_name employee_count
Sales 3
HR 2
Marketing 0

5. FULL JOIN과 여러 테이블 결합

FULL JOIN은 여러 테이블을 결합할 때 사용될 수 있으며, 특히 양쪽 테이블 모두에서 일치하지 않는 데이터를 포함하는 경우에 유용합니다.

예제: 직원, 부서, 프로젝트 정보를 결합하여 모든 데이터를 조회

SELECT employees.name, departments.department_name, projects.project_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id
FULL JOIN projects ON employees.project_id = projects.id;

이 쿼리는 모든 직원, 모든 부서, 그리고 모든 프로젝트를 포함한 데이터를 조회합니다. 일치하지 않는 데이터는 NULL로 처리됩니다.

결과 예시:

name department_name project_name
John Sales Alpha
Jane HR NULL
NULL Marketing NULL
Bob NULL Gamma

6. FULL JOIN과 NULL 값 처리

FULL JOIN에서는 양쪽 테이블에 일치하는 값이 없는 경우 NULL이 반환됩니다. COALESCE() 함수를 사용하여 NULL 값을 처리할 수 있습니다.

예제: NULL 값을 기본값으로 대체

다음은 직원이 없는 경우 "No Employee", 부서가 없는 경우 **"No Department"**라는 기본값을 사용하는 예제입니다.

SELECT COALESCE(employees.name, 'No Employee') AS employee_name,
       COALESCE(departments.department_name, 'No Department') AS department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id;

이 쿼리는 직원이 없거나 부서가 없는 경우에 기본값을 표시합니다.

결과 예시:

employee_name department_name
John Sales
Jane HR
No Employee Marketing
Bob No Department

7. FULL JOIN과 대소문자 구분

SQL에서 FULL JOIN은 기본적으로 대소문자를 구분하지 않습니다. 즉, 문자열 비교에서 Salessales를 같은 값으로 처리합니다. 대소문자를 구분해야 할 경우 데이터베이스 시스템에 따라 BINARY 같은 키워드를 사용할 수 있습니다.

8. FULL JOIN 지원 여부

FULL JOIN은 모든 데이터베이스에서 지원되는 것은 아닙니다. 일부 데이터베이스(MySQL 등)에서는 FULL JOIN을 직접적으로 지원하지 않으며, LEFT JOINRIGHT JOINUNION으로 결합하여 동일한 결과를 얻을 수 있습니다.

MySQL에서 FULL JOIN 구현 예제:

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;

이 쿼리는 LEFT JOINRIGHT JOIN을 결합하여 FULL JOIN과 동일한 결과를 제공합니다.

9. FULL JOIN과 LEFT/RIGHT JOIN 비교

  • LEFT JOIN: 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하지 않는 경우 NULL을 반환합니다.
  • RIGHT JOIN: 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서 일치하지 않는 경우 NULL을 반환합니다.
  • FULL JOIN: 두 테이블의 모든 행을 반환하고, 일치하지 않는 경우 양쪽 테이블에서 NULL을 반환합니다.

10. 실전 예제

예제 1: 모든 직원과 부서 정보 결합 (직원이나 부서가 없는 경우 포함)

SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.id;

이 쿼리는 모든 직원모든 부서 정보를 포함하여 일치하지 않는 데이터도 조회합니다.

예제 2: 직원이 없는 부서와 부서가 없는 직원 조회

SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.id
WHERE e.name IS NULL OR d.department_name IS NULL;

이 쿼리는 직원이 없는 부서부서가 없는 직원을 조회합니다.

예제 3: 부서별로 직원 수 계산 (직원이 없는 부서 포함)

SELECT d.department_name, COUNT(e.id) AS employee_count
FROM employees e
FULL JOIN departments d ON e.department_id = d.id
GROUP BY d.department_name;

이 쿼리는 부서별 직원 수를 계산하며, 직원이 없는 부서도 포함됩니다.

11. 요약

  • SQL FULL JOIN은 두 테이블의 모든 데이터를 결합하여 일치하는 데이터를 반환하고, 일치하지 않는 데이터는 NULL로 처리하는 방식의 JOIN입니다.
  • LEFT JOINRIGHT JOIN의 결합으로 생각할 수 있으며, 양쪽 테이블에서 누락된 데이터를 모두 포함할 수 있습니다.
  • COALESCE() 함수를 사용하여 NULL 값을 적절히 처리할 수 있으며, 일부 데이터베이스에서는 FULL JOIN을 지원하지 않기 때문에 LEFT JOINRIGHT JOINUNION으로 결합하여 같은 결과를 얻을 수 있습니다.
  • FULL JOIN은 모든 데이터, 특히 일치하지 않는 데이터까지 포함하여 조회해야 할 때 유용합니다.

copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com