SQL 계층형 질의와 셀프 조인: 개념과 활용 방법
데이터베이스에서는 조직도, 제품 카테고리, 폴더 구조 등 계층적인 데이터를 다룰 일이 많습니다.
이러한 계층 구조 데이터를 조회하는 방법으로는 계층형 질의(Hierarchical Query)와 셀프 조인(Self Join)이 있습니다.
이번 글에서는 초심자가 쉽게 이해할 수 있도록 샘플 테이블을 활용하여 개념과 실행 과정을 단계별로 설명하겠습니다.
1. 샘플 테이블: 직원(Employees) 테이블
다음과 같은 Employees 테이블이 있다고 가정합니다.
이 테이블에는 직원(Employee)과 그 직원의 상사(Manager) 정보가 포함되어 있습니다.
EmployeeID | EmployeeName | ManagerID | Department |
1 | Alice | NULL | CEO |
2 | Bob | 1 | Sales |
3 | Jane | 1 | Marketing |
4 | John | 2 | Sales |
5 | Tom | 3 | HR |
🔹 ManagerID는 해당 직원의 직속 상사의 EmployeeID를 나타냅니다.
🔹 Alice는 CEO(최고 관리자)이므로 ManagerID가 NULL입니다.
🔹 Bob과 Jane은 Alice의 부하 직원이며, Bob의 부하 직원은 John입니다.
🔹 Jane의 부하 직원으로 Tom이 있습니다.
이제 계층형 질의(Hierarchical Query)와 셀프 조인(Self Join)을 활용하여 이 계층 구조를 조회하는 방법을 알아보겠습니다.
2. 계층형 질의 (Hierarchical Query)란?
계층형 질의는 부모-자식 관계가 있는 데이터를 조회할 때 사용됩니다.
오라클(Oracle)에서는 CONNECT BY 절을 사용하여 계층형 데이터를 쉽게 조회할 수 있습니다.
🔹 오라클에서 계층형 질의 실행하기
SELECT EmployeeID, EmployeeName, ManagerID, LEVEL
FROM Employees
START WITH ManagerID IS NULL
CONNECT BY PRIOR EmployeeID = ManagerID;
🔹 쿼리 실행 순서
1️⃣ START WITH ManagerID IS NULL → 최상위 관리자(CEO)인 Alice(ManagerID가 NULL인 직원)부터 시작
2️⃣ CONNECT BY PRIOR EmployeeID = ManagerID → 현재 행의 ManagerID가 부모(EmployeeID)와 일치하는 경우 조회
3️⃣ 각 직원(Employee)이 계층 구조에서 어디에 위치하는지 LEVEL을 표시
🔹 실행 결과
EmployeeID | EmployeeName | ManagerID | LEVEL |
1 | Alice | NULL | 1 |
2 | Bob | 1 | 2 |
3 | Jane | 1 | 2 |
4 | John | 2 | 3 |
5 | Tom | 3 | 3 |
✅ LEVEL 값이 1이면 최상위 관리자(CEO), 2면 그다음 계층(팀장), 3이면 더 아래 계층(사원)입니다.
✅ 오라클에서는 CONNECT BY를 사용하여 계층 구조를 쉽게 표현할 수 있습니다.
3. 셀프 조인(Self Join)이란?
셀프 조인은 같은 테이블을 두 번 사용하여 자신과 조인하는 방식입니다.
이를 통해 계층 구조를 조회할 수도 있습니다.
🔹 SQL Server, MySQL에서 셀프 조인을 활용한 계층 구조 조회
SQL Server 및 MySQL에서는 CONNECT BY가 없으므로 셀프 조인을 사용하여 계층 구조를 조회해야 합니다.
SELECT E1.EmployeeName AS Employee,
E2.EmployeeName AS Manager
FROM Employees E1
LEFT JOIN Employees E2
ON E1.ManagerID = E2.EmployeeID;
🔹 쿼리 실행 순서
1️⃣ FROM Employees E1 → 직원 테이블에서 모든 직원(Employee)을 가져옵니다.
2️⃣ LEFT JOIN Employees E2 ON E1.ManagerID = E2.EmployeeID → E1 테이블의 ManagerID와 E2 테이블의 EmployeeID가 같은 행을 연결합니다.
즉, 각 직원의 ManagerID가 다른 직원의 EmployeeID와 일치하면 관리자(Manager) 이름을 가져옵니다.
3️⃣ 최종적으로 직원 이름과 관리자 이름을 조회합니다.
🔹 실행 결과
Employee | Manager |
Alice | NULL |
Bob | Alice |
Jane | Alice |
John | Bob |
Tom | Jane |
✅ Alice는 CEO이므로 관리자가 없고(NULL), Bob과 Jane은 Alice의 부하 직원입니다.
✅ John은 Bob의 부하 직원이며, Tom은 Jane의 부하 직원입니다.
4. 계층형 질의 vs 셀프 조인 비교
구분 | 계층형 질의 (Hierarchical Query) | 셀프 조인 (Self Join) |
사용 목적 | 계층 구조 데이터 조회 | 부모-자식 관계 조회 |
사용 가능 DB | Oracle (전용) | 모든 DBMS에서 사용 가능 |
구문 방식 | CONNECT BY, START WITH 사용 | JOIN을 사용하여 연결 |
장점 | 간결하고 직관적인 계층 구조 표현 | 모든 DBMS에서 적용 가능 |
단점 | 오라클에서만 사용 가능 | 성능이 느려질 수 있음 |
✅ 오라클에서는 CONNECT BY를 사용하여 계층 구조를 쉽게 조회할 수 있습니다.
✅ SQL Server, MySQL에서는 JOIN을 활용하여 셀프 조인 방식으로 계층 구조를 조회할 수 있습니다.
5. 결론
✅ 계층형 질의(Hierarchical Query) → 오라클에서 CONNECT BY를 사용하여 계층 데이터를 손쉽게 조회
✅ 셀프 조인(Self Join) → 모든 데이터베이스에서 JOIN을 사용하여 부모-자식 관계를 조회 가능
✅ 데이터베이스 환경에 따라 적절한 계층 구조 조회 방법을 선택해야 함
SQLD 자격증 대비를 위해 각 기법의 차이점을 이해하고, 실제 데이터를 활용하여 실습해 보는 것이 중요합니다!