Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

SQL 외부 조인(OUTER JOIN) 완벽 가이드: LEFT, RIGHT, FULL JOIN 총정리

데이터베이스를 다루다 보면 두 개 이상의 테이블을 동시에 조회하여 하나의 결합된 결과 집합을 만들어야 하는 경우가 자주 발생합니다. 예를 들어, 모든 직원의 이름과 각 직원이 속한 부서 정보를 조회하고 싶은데, 이 두 정보가 서로 다른 테이블에 저장되어 있다면 어떻게 해야 할까요?

바로 이럴 때 SQL 조인(JOIN)이 필요합니다. 테이블을 조인하면 여러 테이블에 걸쳐 쿼리를 실행하고 결합된 결과를 얻을 수 있습니다.

이 글에서는 여러 조인 유형 중 OUTER JOIN(외부 조인)에 초점을 맞춰 살펴봅니다. OUTER JOIN은 조인 대상 테이블에 일치하는 행이 없더라도 해당 행을 결과에 포함시켜 반환합니다. 세 가지 유형의 OUTER JOIN, 그 작동 방식, 그리고 실제 SQL 쿼리에서 활용하는 방법까지 차근차근 알아보겠습니다.

SQL 조인 기본 복습

일반적으로 SELECT 문으로 시작하는 쿼리는 데이터베이스에서 정보를 조회할 때 사용됩니다. 보통 쿼리를 작성할 때는 한 테이블에서 정보를 가져오며, FROM 절을 통해 조회할 테이블을 지정합니다. 표준적인 SQL 쿼리의 기본 문법은 다음과 같습니다.

SELECT column_name FROM table_name WHERE certain_conditions_are_met;

예를 들어, employees(직원) 테이블에서 모든 직원의 이름 목록을 조회하는 쿼리는 다음과 같습니다.

SELECT name FROM employees;

이 쿼리는 아래와 같은 결과를 반환합니다.

name
Luke
Mike
Hannah
Geoff
Alexis
Emma
Jonah
Adam

(8 rows)

또한 WHERE 절을 사용하면 특정 조건을 만족하는 레코드만 필터링하여 조회할 수 있습니다. 예를 들어 영업팀 소속 직원이나 임원진의 이름만 찾는 쿼리를 작성할 수 있습니다.

그렇다면 여러 테이블에서 정보를 가져와 하나의 테이블로 결합하려면 어떻게 해야 할까요? 바로 이때 조인이 필요합니다.

조인을 사용하면 여러 테이블을 동시에 조회하고, 일치하는 행들을 결합한 결과 집합을 만들 수 있습니다. 조인에는 크게 세 가지 유형이 있습니다: INNER JOIN, OUTER JOIN, CROSS JOIN.

INNER JOIN은 양쪽 테이블 모두에 일치하는 행이 있는 경우에만 결과를 반환합니다. 반면 OUTER JOIN은 조인된 테이블에 관련 행이 없어도 결과에 포함시킵니다. CROSS JOIN은 조인 조건 없이 수행되는 조인으로, 한 테이블의 각 행이 다른 테이블의 모든 행과 조합됩니다(카티션 곱).

SQL 외부 조인(OUTER JOIN)이란?

앞서 말씀드린 것처럼 INNER JOIN을 수행하면 다른 테이블에 일치하지 않는 행은 결과 집합에서 제외됩니다. 하지만 이런 값들도 조회해야 한다면 어떻게 해야 할까요? 이때 OUTER JOIN을 사용하면 해당 데이터를 가져올 수 있습니다.

OUTER JOIN에는 세 가지 유형이 있습니다.

  • LEFT OUTER JOIN: 왼쪽 테이블에서 일치하지 않는 행을 반환합니다.
  • RIGHT OUTER JOIN: 오른쪽 테이블에서 일치하지 않는 행을 반환합니다.
  • FULL OUTER JOIN: 모든 테이블에서 일치하지 않는 행을 반환합니다.

OUTER JOIN은 필요에 따라 양쪽 테이블의 레코드를 매칭할 수 있으며, 사용하는 조인 유형에 맞는 모든 관련 레코드를 반환합니다.

SQL LEFT JOIN (왼쪽 외부 조인)

LEFT JOIN은 왼쪽 테이블의 모든 행과, 조인 조건을 만족하는 오른쪽 테이블의 행을 함께 반환합니다.

예를 들어 employees(직원)와 company_departments(회사 부서)라는 두 테이블이 있다고 가정해 보겠습니다. 부서에 배정되지 않은 직원까지 포함하여 모든 직원의 이름과 부서 이름을 조회하고 싶다면 LEFT JOIN을 사용하면 됩니다.

아래는 공통 컬럼인 department_id 값을 기준으로 employees 테이블과 company_departments 테이블을 결합하여, 모든 직원의 이름과 부서 이름을 조회하는 LEFT JOIN 쿼리 예제입니다.

SELECT employees.name, company_departments.name
FROM employees
LEFT JOIN company_departments
ON employees.department_id = company_departments.department_id;

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

namename
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive
Adam

(8 rows)

결과에서 확인할 수 있듯이, LEFT JOINcompany_departments 테이블에서 해당 직원의 부서를 찾을 수 없는 경우에도 employees 테이블의 모든 행을 반환했습니다. Adam의 경우 부서가 배정되지 않아 부서 이름이 NULL로 표시됩니다.

SQL RIGHT JOIN (오른쪽 외부 조인)

RIGHT JOINLEFT JOIN과 정반대로 작동합니다. RIGHT JOIN은 오른쪽 테이블의 모든 행과, 조인 조건을 만족하는 왼쪽 테이블의 행을 함께 반환합니다.

이번에는 모든 부서의 이름과 각 부서에 근무하는 직원들의 이름을 조회하고, 직원이 배정되지 않은 부서의 데이터까지 함께 가져오고 싶다고 가정해 보겠습니다. 다음 쿼리를 사용하면 이 데이터를 얻을 수 있습니다.

SELECT employees.name, company_departments.name AS "DeptName"
FROM employees
RIGHT JOIN company_departments
ON employees.department_id = company_departments.department_id;

위 쿼리는 다음과 같은 결과를 반환합니다.

name“deptname”
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive

Payroll

Information Technology

(9 rows)

결과를 보면 쿼리가 모든 부서 목록과 각 부서에 근무하는 직원들의 이름을 반환했으며, 현재 직원이 배정되지 않은 Payroll(급여) 부서와 Information Technology(정보기술) 부서도 함께 포함되어 있습니다.

또한 주목할 점은, 앞선 LEFT JOIN 쿼리에서 부서가 배정되지 않았던 직원 Adam은 이번 결과에 나타나지 않았다는 것입니다. 그 이유는 RIGHT JOIN이 조건을 만족하는 오른쪽 테이블(company_departments)의 모든 행을 기준으로 반환하기 때문입니다. Adam은 오른쪽 테이블의 어떤 레코드와도 연관성이 없으므로 결과에서 제외된 것입니다.

SQL FULL OUTER JOIN (완전 외부 조인)

FULL OUTER JOIN은 비교적 드물게 사용되는 SQL 조인 유형으로, 양쪽 테이블에서 일치하지 않는 레코드까지 모두 반환할 수 있습니다. 실무에서는 FULL OUTER JOIN을 집계 함수와 함께 사용하여 두 테이블 간의 중복 범위(교집합의 크기)를 파악하는 용도로 활용하기도 합니다.

모든 직원과 모든 부서의 전체 목록을 조회하고 싶다면 다음 SQL 쿼리를 사용할 수 있습니다.

SELECT employees.name, company_departments.name AS "DeptName"
FROM employees
FULL OUTER JOIN company_departments
ON employees.department_id = company_departments.department_id;

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

name“deptname”
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive
Adam

Payroll

Information Technology

(10 rows)

위 결과 집합에는 부서에 배정되지 않은 직원을 포함한 모든 직원의 이름과 배정된 부서가 포함되어 있으며, 직원이 한 명도 배정되지 않은 부서의 이름까지 모두 포함되어 있습니다.

마무리

조인(JOIN)은 두 개 이상의 테이블을 동시에 조회하여 결합된 결과 집합을 만들 수 있게 해주는 SQL 기능입니다. 예를 들어 회사 직원 목록과 각 직원의 최근 급여 지급일을 함께 조회하고 싶다면 조인을 활용하면 됩니다.

이 튜토리얼에서는 조인된 테이블에 일치하는 행이 없어도 해당 행을 반환하는 OUTER JOIN에 대해 집중적으로 살펴보았습니다. 또한 OUTER JOIN의 세 가지 주요 유형인 LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN의 작동 방식을 실제 예제를 통해 확인했습니다.

이제 여러분도 전문가처럼 SQL JOIN 연산을 수행할 준비가 되었습니다!