셀프 JOIN이란 무엇인가요
별칭을 사용해 테이블을 자기 자신과 JOIN합니다.
셀프 JOIN이란 무엇인가요은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
테이블을 자기 자신과 조인하기
자기 조인은 테이블을 자기 자신과 조인하는 것입니다. 처음에는 낯설게 들릴 수 있지만, 하나의 테이블에 있는 행들이 같은 테이블의 다른 행들과 서로 관련되어 있을 때 사용하는 강력한 기법입니다.
가장 흔한 예는 각 직원의 행에 관리자 ID도 저장하는 직원 테이블입니다. 관리자는 같은 테이블에 저장된 직원이기도 합니다.
직원 테이블
employees 테이블을 생각해 보겠습니다. 각 행에는 id, name, 그리고 같은 테이블의 다른 행을 가리키는 manager_id가 있습니다.
이 구조를 자기 참조 또는 재귀 관계라고 합니다. 아래 쿼리를 실행하여 테이블을 생성하고 데이터를 채워 보겠습니다.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);여기서는 일반 조인이 작동하지 않는 이유
직원마다 관리자 이름을 함께 표시하려면 두 데이터가 모두 같은 테이블에 있습니다. 일반 조인은 서로 다른 두 테이블(또는 적어도 서로 다른 두 데이터 원본)을 연결합니다.
같은 테이블에서 두 번 읽으려면(한 번은 직원으로, 한 번은 관리자로) 테이블 별칭과 자기 조인을 함께 사용해야 합니다.
별칭 소개
자기 조인을 수행하려면 FROM / JOIN 절에 같은 테이블 이름을 두 번 쓰고, 각 항목에 서로 다른 별칭을 지정합니다. 별칭을 사용하면 SQL이 두 항목을 서로 별개의 논리적 테이블로 취급할 수 있습니다.
일반적으로 직원에는 e, 관리자에는 m처럼 짧고 의미가 분명한 별칭을 사용합니다.
-- Conceptual structure (not yet a full query)
-- FROM employees AS e
-- JOIN employees AS m ON e.manager_id = m.id첫 번째 자기 조인
다음은 모든 직원을 관리자의 이름과 함께 나열하는 완전한 자기 조인입니다. ON 조건은 직원의 manager_id를 관리자의 id와 연결합니다.
Alice에게는 관리자가 없으므로 INNER JOIN에서 제외됩니다. 관리자 쪽에 일치하는 행이 없기 때문입니다.
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id;관리자가 없는 행 포함하기
INNER JOIN을 사용하면 일치하는 행이 없는 행은 제거됩니다. Alice의 manager_id = NULL이므로 결과에서 사라집니다.
LEFT JOIN으로 전환하면 모든 직원을 유지하면서 관리자가 없을 때 NULL(또는 레이블)을 표시할 수 있습니다.
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.id;자기 조인 결과 필터링하기
다른 쿼리와 마찬가지로 자기 조인에도 WHERE 절을 추가할 수 있습니다. 아래 예에서는 직속 관리자가 Alice인 직원만 조회합니다(id = 1).
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
WHERE m.name = 'Alice';직속 부하 직원 수 세기
자기 조인은 집계 함수와 자연스럽게 함께 사용할 수 있습니다. 아래 쿼리는 관리자 별칭을 기준으로 그룹화하여 각 관리자에게 직속 부하 직원이 몇 명 있는지 계산합니다.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;비계층적 데이터에서 자기 조인 사용하기
자기 조인은 계층 구조에만 사용할 수 있는 것은 아닙니다. 테이블의 행이 같은 테이블의 다른 행과 관련되어 있다면 언제든 자기 조인이 도움이 될 수 있습니다.
예를 들어 같은 관리자에게 보고하는 모든 직원 쌍을 찾을 수 있습니다. 일치하는 manager_id 값을 기준으로 테이블을 자기 자신과 조인하면서 직원이 자기 자신과 짝지어지지 않도록 합니다.
SELECT
a.name AS employee_1,
b.name AS employee_2,
a.manager_id
FROM employees AS a
INNER JOIN employees AS b
ON a.manager_id = b.manager_id
AND a.id < b.id;별칭의 역할
자기 조인에서는 별칭이 필수입니다. 별칭이 없으면 데이터베이스가 각 열이 테이블의 어느 복사본을 가리키는지 구분할 수 없으므로 모호성 오류가 발생합니다.
별칭 이름은 원하는 대로 지정할 수 있습니다. 핵심 규칙은 모든 열 참조 앞에 올바른 별칭을 붙여 SQL이 테이블의 어느 인스턴스를 조회해야 하는지 알 수 있게 하는 것입니다.
-- This will fail: column 'name' is ambiguous
-- SELECT name FROM employees JOIN employees ON manager_id = id;
-- This works: aliases remove the ambiguity
SELECT e.name, m.name
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;실제 활용 사례
자기 조인은 실제 데이터베이스에서 자주 사용됩니다. 일반적인 활용 사례는 다음과 같습니다.
- 조직도 — 직원과 관리자
- 카테고리 트리 — 상위 카테고리와 하위 카테고리
- 자재 명세서 — 다른 구성 요소로 이루어진 구성 요소
- 소셜 네트워크 — 하나의 연결 테이블에서 친구의 친구 찾기
스키마에서 자기 참조 외래 키를 발견하면 자기 조인이 필요할 수 있다는 첫 번째 단서가 됩니다.
간단히 확인하기
다음으로 넘어가기 전에 자기 조인에 대한 이해도를 확인해 보세요.
학습 내용 정리
이번 학습에서는 자기 조인이 무엇이며 언제 사용하는지 배웠습니다.
- 자기 조인은 서로 다른 별칭을 사용하여 테이블을 두 번 참조함으로써 테이블을 자기 자신과 연결합니다.
- 일치하는 행이 없는 행(예: 최상위 관리자)을 제외하려면
INNER JOIN을 사용하고, 포함하려면LEFT JOIN을 사용합니다. - 다른 모든 조인과 마찬가지로
WHERE,GROUP BY및 집계 함수를 추가할 수 있습니다. - 같은 테이블 안의 행을 비교할 때 중복된 쌍을 피하려면
ON절에서a.id < b.id를 사용합니다. - 자기 조인은 계층형 데이터, 카테고리 트리 및 모든 자기 참조 관계에 가장 먼저 고려할 도구입니다.
다음으로는 재귀 CTE를 사용하여 여러 단계의 계층 구조를 살펴봅니다.
자주 묻는 질문
“셀프 JOIN이란 무엇인가요” 강의는 무료인가요?
네 — “셀프 JOIN이란 무엇인가요” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“셀프 JOIN이란 무엇인가요”에서 뭘 배우나요?
별칭을 사용해 테이블을 자기 자신과 JOIN합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“셀프 JOIN이란 무엇인가요” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 셀프 JOIN이란 무엇인가요
- 직원과 관리자
- 같은 테이블의 행 비교하기
- 셀프 JOIN의 한계