[SQL] 쉬워지는 JOIN 2편 - SELF JOIN

하나의 테이블 만으로 원하는 결과를 얻을 수 있다면 정말 좋겠지만, 우리는 대체로 아주 복잡한 서비스를 구축하고 사용합니다.

… 그렇다면 당연히 테이블의 개수도 늘어나고 복잡해지겠죠.

간단한 서비스라고 하더라도 유지보수, 중복방지 등의 목적으로 테이블을 분리해서 사용하기도 합니다.(정규화)

반대로 성능을 목적으로 테이블을 병합하는 등 중복된 데이터를 하용하기도 하죠(반정규화)

우리는 정규화를 통해 나눠진 테이블 간의 조합을 통해 원하는 결과를 도출해낼 수 있습니다.

바로, 조인(JOIN)이라는 방법으로 말이죠!

여러분들이 조금의 SQL 공부를 하셨다면 기본적으로 JOIN의 종류를 알고 계실 것입니다.

JOIN은 두 개의 테이블을 서로 묶어서 원하는 결과를 도출해내는 것을 말합니다.

기본적으로 알고있는 JOIN의 종류는 아래와 같습니다.

OverView

  • INNER JOIN: 두 테이블 간, 공통으로 존재하는 데이터를 기반으로 행을 결합
    • EQUAL-JOIN: 일반적인 INNER JOIN → 두 테이블의 열이 같은 값을 가지는 경우
    • NON-EQUAL-JOIN: 두 테이블의 열이 특정 관계를 만족하는 경우(크기 비교)
    • NATURAL JOIN: 공통 열을 자동으로 찾아서 JOIN 수행
    • SELF JOIN: 같은 테이블 내에서 자신을 참조하여 JOIN 수행
    • SEMI JOIN: 한 테이블의 특정 조건을 만족하는 행과 매칭되는 다른 테이블의 일부만을 반환
    • ANTI JOIN: 한 테이블의 특정 조건을 만족하지 않는 행을 기준으로 다른 테이블에서 관련 없는 데이터를 반환
  • OUTER JOIN
    • Left OUTER JOIN: 왼쪽 테이블을 기준으로 조인 조건에 부합하지 않는 오른쪽 테이블의 행은 NULL로 반환.
    • Right OUTER JOIN: 오른쪽 테이블을 기준으로 조인 조건에 부합하지 않는 왼쪽 테이블의 행은 NULL로 반환.
    • FULL OUTER JOIN: 양 테이블을 모두 기준으로 하여 서로 조인 조건에 부합하지 않는 행은 NULL로 반환
  • CROSS JOIN: 두 테이블의 행을 모두 조합하여 결과를 반환
  • 오늘의 파트 → SELF JOIN (보통 INNER JOIN이나 OUTER JOIN의 특수한 경우로 포함됨)
  • JOIN 기술
    • HASH JOIN: 해시 테이블을 사용하여 JOIN을 수행합니다. 대규모 데이터에 효율적
    • MERGE JOIN: 두 테이블의 데이터를 정렬하여 병합하는 방식으로 JOIN을 수행
    • NESTED LOOP JOIN: 한 테이블의 각 행에 대해 다른 테이블의 모든 행을 순차적으로 비교하여 JOIN을 수행

너무 많은 종류의 조인이 있죠..? 참 어렵습니다ㅠ

그렇기 때문에 하나씩 자세히! 알아가보겠습니다.

오늘 포스팅에서 알아 볼 JOIN은

  • SELF JOIN

입니다!

1편에 비해서 다루는 내용이 적기 때문에 편할 것 같습니다!

예시 테이블

직원(Employees)

id name manager_id
1 Alice NULL
2 Bob 1
3 Charlie 1
4 David 2

SELF JOIN

셀프 조인은 데이터베이스의 한 테이블 내에서 자기 자신을 참조하는 특이한 조인 케이스입니다.

💡 어떨 때 사용하나요?
동일한 테이블 내에서 데이터를 비교, 연관 지을 때 사용합니다.

특징

1. 동일한 테이블 사용

2. 비교 및 관계 설정 </aside>

SELECT e1.name AS EMPLOYEE, e2.name AS MANAGER
FROM Employees e1
LEFT JOIN Employees e2
ON e1.manager_id = e2.id;

 

해설

e1의 ManagerID와 e2의 ID를 기준으로 LEFT JOIN을 수행하여 각 직원의 관리자 정보를 가져옵니다.

  • Alice는 관리자가 없으므로 Manager 열은 NULL
  • Bob은 Alice가 관리자이므로 Manager 열에 Alice가 표시,
  • Charlie는 Alice가 관리자이므로 Manager 열에 Alice가 표시,
  • David는 Bob이 관리자이므로 Manager 열에 Bob이 표시됩니다.

결과

Employee Manager
Alice NULL
Bob Alice
Charlie Alice
David Bob