직원과 관리자
계층 구조를 보여 주는 대표적인 예시입니다.
직원과 관리자은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
자기 조인이란?
자기 조인은 테이블을 자기 자신과 조인하는 것입니다. 낯설게 들릴 수 있지만, 테이블의 행이 같은 테이블의 다른 행과 관계를 맺고 있을 때 매우 유용합니다.
전형적인 예는 각 직원에게 관리자가 있을 수 있고, 그 관리자도 같은 테이블에 저장된 직원인 직원 테이블입니다.
직원 테이블
간단한 employees 테이블을 만들어 보겠습니다. 각 직원에게는 id, name, 그리고 같은 테이블의 다른 행을 가리키는 manager_id가 있습니다.
manager_id가 NULL이면 해당 직원에게 관리자가 없다는 뜻이며, 계층 구조의 최상위에 있습니다(예: CEO).
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
manager_id INT REFERENCES employees(id)
);예시 데이터 삽입
작은 회사의 계층 구조를 나타내는 데이터를 테이블에 채워 보겠습니다. Alice는 CEO이므로 관리자가 없습니다. Bob과 Carol은 모두 Alice에게 보고하고, Dave와 Eve는 Bob에게 보고합니다.
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);조인 없이 조회하기
모든 행을 그대로 선택하면 관리자 이름이 아니라 원시 manager_id 숫자가 표시됩니다. 이렇게 표시하면 읽기 어렵고 최종 사용자에게도 유용하지 않습니다.
SELECT id, name, manager_id
FROM employees;자기 조인 작성하기
각 직원 옆에 관리자의 이름을 표시하려면 employees 테이블을 자기 자신과 조인합니다. 각 복사본에 서로 다른 별칭을 지정합니다. 직원에는 e, 관리자에는 m을 사용합니다.
조인 조건은 직원의 manager_id를 관리자의 id와 연결합니다.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;관리자가 없는 직원 포함하기
앞의 INNER JOIN은 Alice의 manager_id가 NULL이므로 Alice를 숨깁니다. 오른쪽에 일치하는 행이 없기 때문입니다. 모든 직원(최상위 직원 포함)을 표시하려면 LEFT JOIN을 사용합니다.
Alice의 관리자 열에는 NULL이 표시됩니다.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;가독성을 위해 COALESCE 사용하기
관리자 열의 NULL은 혼란스러울 수 있습니다. COALESCE를 사용하여 NULL을 '관리자 없음'과 같이 읽기 쉬운 레이블로 바꾸면 보고서의 출력이 더 깔끔해집니다.
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY manager, employee;직속 부하 직원 찾기
질문을 다음과 같이 바꾸어 쿼리할 수 있습니다. 특정 관리자에게 보고하는 사람은 누구인가? 이를 직속 부하 직원 찾기라고 합니다. 여기서는 Alice에게 직접 보고하는 모든 직원을 찾습니다(id = 1).
SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;관리자별 부하 직원 수 세기
자기 조인을 GROUP BY 및 COUNT와 결합하면 각 관리자에게 직속 부하 직원이 몇 명 있는지 확인할 수 있습니다. 이는 업무량 분석에 유용합니다.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;2단계 계층까지
직원, 해당 직원의 관리자, 그리고 관리자의 관리자까지 두 단계의 계층을 한 번에 보려면 테이블을 세 번째로 조인하면 됩니다. 조인을 한 번 추가할 때마다 계층의 단계가 하나씩 늘어납니다.
SELECT
e.name AS employee,
m.name AS manager,
gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;자기 조인의 한계
자기 조인은 고정된 얕은 계층 구조(1~3단계)에 적합합니다. 회사 조직도처럼 깊이를 알 수 없거나 무제한인 경우(10단계까지 내려갈 수 있는 경우)에는 대신 재귀 CTE가 필요합니다.
대부분의 실용적인 직원-관리자 조회에서는 이번 학습에서 다룬 자기 조인 방식이 적합한 도구입니다.
간단히 확인하기
자기 조인과 직원-관리자 계층 구조에 대한 이해도를 확인해 보세요.
학습 내용 정리
이번 학습에서는 하나의 테이블에 저장된 전형적인 직원-관리자 계층 구조를 모델링하고 조회하기 위해 자기 조인을 사용하는 방법을 배웠습니다.
핵심 내용:
- 자기 조인은 서로 다른 두 별칭을 사용하여 테이블을 자기 자신과 조인합니다.
- 조인 조건은 같은 테이블의
manager_id를id와 연결합니다. - 관리자가 있는 직원만 보려면 INNER JOIN을 사용하고, 모든 직원을 포함하려면 LEFT JOIN을 사용합니다.
- COALESCE를 사용하면 NULL인 관리자 값을 읽기 쉬운 레이블로 바꿀 수 있습니다.
- 깊이에 제한이 없는 계층 구조에는 재귀 CTE를 고려합니다.
자주 묻는 질문
“직원과 관리자” 강의는 무료인가요?
네 — “직원과 관리자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“직원과 관리자”에서 뭘 배우나요?
계층 구조를 보여 주는 대표적인 예시입니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“직원과 관리자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.