SELF JOIN으로 계층 구조 다루기
직원과 관리자, 부모와 자식 관계를 모델링하기 위해 표를 자기 자신과 JOIN합니다.
SELF JOIN으로 계층 구조 다루기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
SELF JOIN이 실제로 의미하는 것
SELF JOIN은 단순히 하나의 테이블이 양쪽에 나타나는 조인입니다. 특별한 SELF JOIN 키워드는 없으며, 일반적인 INNER 또는 LEFT JOIN을 작성하고 같은 테이블을 두 번 참조합니다.
이 방식이 작동하게 하는 핵심은 테이블 별칭입니다. 각 복사본에 서로 다른 별칭을 지정하면 데이터베이스 엔진은 이를 서로 독립적인 두 테이블로 처리합니다.
SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;별칭이 필수인 이유
서로 다른 별칭이 없으면 쿼리가 모호해집니다. 모든 열 이름이 두 번씩 나타나 어느 복사본을 의미하는지 엔진이 판단할 수 없기 때문입니다. 각 인스턴스에 별칭을 지정하면 이 문제가 해결됩니다.
이 조인을 '각 직원 행을 그 직원의 관리자인 직원 행과 조합한다'고 이해하십시오. e는 직원이고 m은 관리자이며, 둘 다 물리적으로는 같은 테이블에서 가져옵니다.
-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;직원-관리자 모델
SELF JOIN의 전형적인 시나리오는 인접 목록입니다. 하나의 테이블에 행을 저장하고, 각 행은 같은 테이블을 참조하는 외래 키를 통해 부모를 가리킵니다.
employees 테이블에서 manager_id가 employees.id를 참조하도록 하면 하나의 테이블로 전체 조직도를 표현할 수 있습니다. 각 관리자는 그저 또 하나의 직원 행일 뿐입니다.
-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.id모든 직원과 관리자를 함께 나열하기
가장 자주 나오는 SELF JOIN 질문은 각 직원 옆에 관리자의 이름을 표시하는 것입니다. 직원 복사본과 관리자 복사본을 e.manager_id = m.id 조건으로 조인하십시오.
이 쿼리는 관리자가 존재하는 직원마다 한 행을 반환합니다. 조직의 최상위에 있는 CEO는 manager_id가 NULL이므로 INNER JOIN에서는 제외된다는 점에 유의하십시오.
SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;트리의 최상위 항목을 유지하는 LEFT JOIN
manager_id가 NULL인 CEO를 포함하려면 LEFT JOIN으로 바꾸십시오. 직원 쪽은 유지되고, 부모가 없는 행에서는 관리자 열이 NULL로 반환됩니다.
면접관은 이를 통해 내부 SELF JOIN이 루트 노드를 제외한다는 사실을 기억하는지 확인합니다. 해결 방법은 일치하지 않는 행을 유지해야 하는 모든 외부 조인 상황에서와 같습니다.
SELECT e.name AS employee,
COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;관리자별 직속 부하 직원 수 세기
자주 이어지는 질문은 다음과 같습니다. 각 관리자에게 직접 보고하는 사람은 몇 명입니까? SELF JOIN을 수행한 다음 관리자별로 그룹화하면 됩니다.
직원을 관리자와 조인하고, 관리자의 식별자로 그룹화한 뒤, 직원을 COUNT합니다. 이는 전체 하위 트리가 아니라 직속 부하 직원만 셉니다.
SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;두 단계 아래까지 탐색하기
직원과 그 직원의 관리자, 그리고 관리자의 관리자까지 가져오려면 테이블 복사본 세 개를 연결하십시오. 각 단계마다 또 하나의 SELF JOIN이 필요합니다.
이 방법은 고정되고 미리 알려진 깊이에서 작동합니다. 임의의 깊이가 필요하다면 SELF JOIN만으로는 부족하며, 이때 재귀 CTE를 사용해야 한다고 언급해야 합니다. 면접관은 이런 답변을 기대합니다.
SELECT e.name AS employee,
m.name AS manager,
g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;SELF JOIN과 재귀 CTE 비교
면접관이 확인하는 핵심 차이는 다음과 같습니다.
- SELF JOIN은 고정된 단계 수를 처리합니다. 복사본 세 개를 사용하면 세 단계까지만 처리할 수 있습니다.
- 재귀 CTE는 새 행이 더 이상 나타나지 않을 때까지 테이블을 자기 자신과 다시 조인하여 제한 없는 깊이를 처리합니다.
따라서 '각 직원과 직속 관리자를 표시하라'는 SELF JOIN으로 해결하지만, '계층을 따라 모든 조상을 나열하라'는 재귀가 필요합니다.
부모-자식 카테고리
같은 패턴으로 모든 트리를 표현할 수 있습니다. 제품 카테고리, 댓글 스레드, 지리적 지역 등이 그 예입니다. categories 테이블에서 parent_id가 자신의 id를 참조하도록 하는 구조는 직원-관리자 사례와 형태가 같습니다.
'자기 참조 외래 키가 있는 테이블'은 'SELF JOIN 또는 재귀'로 처리한다는 점을 알아두는 것이 재사용 가능한 핵심 통찰입니다.
SELECT c.name AS category,
p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;흔한 SELF JOIN 실수
면접에서 다음과 같은 실수를 주의하십시오.
- 별칭을 잊어 모호한 열 오류가 발생하는 경우
INNER JOIN을 사용하여 루트 행(NULL인 부모)을 조용히 제외하는 경우- 잘못된 방향으로 조인하는 경우:
e.manager_id = m.id대신e.id = m.manager_id를 사용하는 경우
ON을 작성하기 전에 어느 별칭이 자식이고 어느 별칭이 부모인지 항상 소리 내어 설명하십시오.
SELF JOIN을 사용하는 경우
테이블의 행이 같은 테이블의 다른 행과 관계를 맺을 때마다 SELF JOIN을 고려하십시오.
- 한 단계의 조회로 충분한 계층 구조(직원과 관리자)
- 하나의 테이블에 있는 행을 조합하거나 비교하는 경우(다음 수업에서 다룹니다)
관계가 재귀적이고 깊이에 제한이 없다면 더 적절한 도구로 재귀 CTE를 사용한다고 말하십시오. 이러한 차이를 이해하는 것이 초급자와 중급자를 구분합니다.
빠른 확인
계층 구조에서 SELF JOIN을 사용하는 방법을 얼마나 이해했는지 확인해 보십시오.
복습: 계층 구조에서의 SELF JOIN
핵심 요점:
- SELF JOIN은 같은 테이블을 양쪽에 사용하는 일반적인 조인이며, 별칭으로 양쪽을 구분합니다.
manager_id와 같은 자기 참조 외래 키를 사용하는 인접 목록은 하나의 테이블에 트리를 표현합니다.- 일치하는 쌍에는
INNER JOIN을 사용하고, NULL인 부모가 있는 루트 행을 유지하려면LEFT JOIN을 사용하십시오. - SELF JOIN은 고정된 깊이를 처리하며, 제한 없는 탐색에는 재귀 CTE가 필요합니다.
자주 묻는 질문
“SELF JOIN으로 계층 구조 다루기” 강의는 무료인가요?
네 — “SELF JOIN으로 계층 구조 다루기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“SELF JOIN으로 계층 구조 다루기”에서 뭘 배우나요?
직원과 관리자, 부모와 자식 관계를 모델링하기 위해 표를 자기 자신과 JOIN합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“SELF JOIN으로 계층 구조 다루기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CROSS JOIN과 카테시안 곱
- SELF JOIN으로 계층 구조 다루기
- 하나의 표 안에서 행 비교하기
- 적절한 JOIN 유형 선택하기