0Pricing
SQL Academy · 강의

셀프 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 셀프 JOIN이란 무엇인가요
  2. 직원과 관리자
  3. 같은 테이블의 행 비교하기
  4. 셀프 JOIN의 한계
← SQL Academy(으)로 돌아가기