SQL - Full Join: 초보자를 위한 종합 가이드

안녕하세요, 미래의 SQL 마에스트로们! SQL Full Joins의 세계로 가는 흥미로운 여정에서 여러분의 안내자로서 기쁩니다. 컴퓨터 과학 교사로서 수년간의 경험을 가지고 있으며, 이 강력한 개념을 마침내 이해하게 되는 학생들이 얼마나 밝아지는지 본 적이 많습니다. 그麼, 우리는 손을 걷어붙이고 다이빙해 보겠습니다!

SQL - Full Join

SQL Full Join

Full Join이란?

大型 파티를 계획하고 있고, 친구들과 가족 각각의 손님 명단이 있다고 상상해 보세요. Full Join은 이 두 명단을 결합하여 모든 사람을 포함하는 것입니다. SQL 용어로는, Full Join은 두 테이블 모두에서 모든 행을 반환하며, 일치 여부와 상관없이 반환합니다.

Full Join의 문법

Full Join의 기본 문법은 다음과 같습니다:

SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

이를 구성해 보겠습니다:

  • SELECT columns: 결과에 포함할 열을 지정합니다.
  • FROM table1: 첫 번째 테이블입니다.
  • FULL JOIN table2: 두 번째 테이블과 Full Join을 수행하겠다는 것을 SQL에 알립니다.
  • ON table1.column = table2.column: 조인 조건으로, 테이블이 어떻게 관련되어 있는지 지정합니다.

간단한 예제

Employees와 Departments라는 두 개의 테이블이 있다고 가정해 봅시다.

-- Employees 테이블 생성
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50),
DepartmentID INT
);

-- Departments 테이블 생성
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);

-- 데이터 삽입
INSERT INTO Employees VALUES (1, 'Alice', 1), (2, 'Bob', 2), (3, 'Charlie', NULL);
INSERT INTO Departments VALUES (1, 'HR'), (2, 'IT'), (3, 'Finance');

-- Full Join 수행
SELECT e.Name, d.DepartmentName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID;

이 쿼리는 다음과 같은 결과를 반환합니다:

Name DepartmentName
Alice HR
Bob IT
Charlie NULL
NULL Finance

Charlie(부서에 배정되지 않은 사람)와 Finance(원하는 직원이 없는 부서)가 여전히 결과에 포함되어 있습니다. 이것이 Full Join의 마법입니다!

여러 테이블 조인하기

이제 한 단계 더 나아가 보겠습니다. 두 개 이상의 테이블을 조인하고 싶다면 어떻게 하나요? 문제 없습니다! Full Joins은 이를 처리할 수 있습니다.

세 개의 테이블 조인 예제

이전 예제에 Projects 테이블을 추가해 보겠습니다:

-- Projects 테이블 생성
CREATE TABLE Projects (
ProjectID INT PRIMARY KEY,
ProjectName VARCHAR(50),
DepartmentID INT
);

-- 데이터 삽입
INSERT INTO Projects VALUES (1, 'Website Redesign', 2), (2, 'Employee Survey', 1), (3, 'Cost Cutting', 3);

-- 세 개의 테이블을 조인하여 Full Join 수행
SELECT e.Name, d.DepartmentName, p.ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID;

이 쿼리는 다음과 같은 종합적인 시각을 제공합니다:

Name DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
Charlie NULL NULL
NULL Finance Cost Cutting

한 쿼리로 모든 직원, 그들의 부서, 그리고 관련 프로젝트를 볼 수 있어서 놀라이죠? 데이터베이스에 X-ray 비전을 가진 것 같아요!

WHERE 절과 Full Join

때로는 Full Join 결과를 필터링하고 싶을 수 있습니다. WHERE 절이 이를 도와줍니다.

Full Join 결과 필터링

이전 쿼리를 수정하여 부서에 프로젝트가 있는 경우만 표시하도록 합시다:

SELECT e.Name, d.DepartmentName, p.ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID
WHERE p.ProjectName IS NOT NULL;

이는 다음과 같은 결과를 제공합니다:

Name DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
NULL Finance Cost Cutting

Charlie가 결과에서 사라진 이유는 그가 어떤 프로젝트에도 연결되어 있지 않기 때문입니다.

NULL 값 처리

Full Joins을 사용할 때 자주 NULL 값을 만나게 됩니다. 여기서 프로팁을 드리자면, COALESCE를 사용하여 NULL을 기본 값으로 변경할 수 있습니다:

SELECT
COALESCE(e.Name, 'Unassigned') AS EmployeeName,
COALESCE(d.DepartmentName, 'No Department') AS DepartmentName,
COALESCE(p.ProjectName, 'No Project') AS ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID;

이는 더 친절한 출력을 제공합니다:

EmployeeName DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
Charlie No Department No Project
Unassigned Finance Cost Cutting

이제 우리는 전체 조직의 명확한 그림을 가지고 있습니다. 부서에 배정되지 않은 직원과 프로젝트가 없는 부서도 포함됩니다.

결론

이렇게 해서 우리는 SQL Full Joins의 세계를 여행했습니다. 기본 개념에서 고급 기술까지. Full Joins은 마치 포함적인 파티 초대장처럼 - 일치 여부와 상관없이 모두를 환영합니다.

이 개념을 연습할수록 Full Joins이 데이터 분석 및 보고에 매우 강력한 도구임을 깨닫게 될 것입니다. 데이터의 전체 그림을 볼 수 있도록 도와줍니다. 그리고 빠르게 누락된 부분도 파악할 수 있습니다.

계속 실험하고, 계속 조인하고, 가장 중요한 것은 SQL을 즐기세요! 얼마 지나지 않아 여러분은 팀에서 Full Join의 ninja가 될 것입니다. 행복하게 코딩하세요!

Credits: Image by storyset