SQL - 자체 조인: 초보자를 위한 친절한 가이드

안녕하세요, SQL 열정가 여러분! SQL 자체 조인의 세계로 흥미로운 여정을 안내해 드리게 되어 기쁩니다. 컴퓨터 과학을 몇 년 동안 가르쳐온 저는 이 개념을 이해하는 학생들의 무수한 "이해!" 순간을 목격해왔습니다. 그麼, 우리는 SQL 마법을 만들어 보겠습니다!

SQL - Self Join

자체 조인이란?

자세한 내용에 들어가기 전에 간단한 비유로 시작해보겠습니다. 가족 모임에 가셨다 치면, 모든 부모-자식 관계를 작성하고 싶습니다. 가족 구성원의 대형 테이블이 있지만, 동일한 테이블 내에서 사람들을 그들의 부모와 연결해야 합니다. 이것이 SQL에서 자체 조인이 하는 일입니다!

자체 조인은 테이블이 자신을 조인하는 것입니다. 마치 테이블이 거울을 보고 자신의 반영과 연결하는 것처럼입니다. 좀 이상하게 들리겠지만, 곧 이해가 될 것입니다!

자체 조인을 사용하는 이유

자체 조인은 단일 테이블에 계층적이거나 재귀적인 데이터가 있을 때 매우 유용합니다. 다음을 생각해보세요:

  1. 직원- 관리자 관계
  2. 가족 트리
  3. 제조업의 부품 및 하위 부품
  4. 포럼의 답글 스레드

SQL 자체 조인의 활용

자체 조인이 어떻게 작동하는지 간단한 예제를 통해 설명해보겠습니다. 우리는 직원 테이블을 사용하여 데모를 진행하겠습니다.

먼저 테이블을 만들어보겠습니다:

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);

INSERT INTO employees (employee_id, name, manager_id)
VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Bob Johnson', 1),
(4, 'Alice Brown', 2),
(5, 'Charlie Davis', 2);

이제 각 직원과 그들의 관리자 이름을 목록에 작성하고 싶다고 가정해봅시다. 이제 자체 조인이 유용하게 사용될 때입니다:

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id;

이 쿼리를 해부해보겠습니다:

  1. 우리는 employees 테이블에서 두 번 선택하여 별칭 e1e2를 부여합니다.
  2. e1은 직원을 나타내고, e2는 잠재적인 관리자를 나타냅니다.
  3. e1manager_ide2employee_id와 일치하는 조건으로 이 두 테이블을 조인합니다.
  4. 우리는 LEFT JOIN을 사용하여 모든 직원을 가져오도록 합니다, 관리자가 없는 사람들도 포함합니다.

결과는 다음과 같을 것입니다:

employee manager
John Doe NULL
Jane Smith John Doe
Bob Johnson John Doe
Alice Brown Jane Smith
Charlie Davis Jane Smith

이게 멋지지 않나요? 단 한 개의 쿼리로 우리는 작은 회사의 전체 관리 구조를 그려냈습니다!

자체 조인에 ORDER BY 절 추가

이제 우리의 쿼리에 약간의 맛을 더해보겠습니다. 결과를 알파벳 순으로 정렬하고 싶을 수 있습니다:

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id
ORDER BY
e1.name ASC;

이 쿼리는 이전 쿼리와 동일하지만, 마지막에 ORDER BY 절이 추가되었습니다. 이는 직원의 이름으로 결과를 알파벳 순으로 정렬합니다.

결과는 다음과 같을 것입니다:

employee manager
Alice Brown Jane Smith
Bob Johnson John Doe
Charlie Davis Jane Smith
Jane Smith John Doe
John Doe NULL

이제 우리는 쉽게 직원과 그들의 관리자를 찾을 수 있습니다.

고급 자체 조인 기술

레벨 업하기 준비되셨나요? 더 복잡한 것을 시도해보겠습니다. 관리자가 동일한 사람인 직원을 찾고 싶다면 어떻게 하겠습니까?

SELECT
e1.name AS employee1,
e2.name AS employee2,
m.name AS shared_manager
FROM
employees e1
JOIN
employees e2 ON e1.manager_id = e2.manager_id AND e1.employee_id < e2.employee_id
JOIN
employees m ON e1.manager_id = m.employee_id;

이 쿼리는 좀 어려 보이지만, 해부해보겠습니다:

  1. 우리는 employees 테이블을 두 번 조인하여 직원을 비교합니다.
  2. 조건 e1.employee_id < e2.employee_id는 중복된 쌍을 피하게 합니다 (예: "Alice와 Bob" 그리고 "Bob과 Alice").
  3. 세 번째 조인을 통해 관리자의 이름을 가져옵니다.

결과는 다음과 같을 것입니다:

employee1 employee2 shared_manager
Jane Smith Bob Johnson John Doe
Alice Brown Charlie Davis Jane Smith

이제 우리는 동일한 관리자를 가진 직원을 찾았습니다!

결론

자체 조인은 처음에는 어려워 보일 수 있지만, SQL 도구箱에서 매우 강력한 도구입니다. 계층적 데이터를 효율적으로 질의하고 단일 테이블 내의 관계를 밝혀낼 수 있습니다.

기억하세요, 연습이 완벽을 이루게 합니다! 자신의 테이블을 만들고 다양한 자체 조인 쿼리를 실험해보세요. 얼마 지나지 않아 자체 조인을 마스터하실 것입니다!

happy querying, 미래의 SQL 마스터 여러분! 그리고 데이터베이스의 세계에서 자신과 이야기하는 것은 전적으로 괜찮습니다... 나는, 자신과 조인하는 것을 의미합니다!

Credits: Image by storyset