계층형 쿼리는 조직도, 메뉴 구조처럼 테이블 내의 행들이 계층적 관계를 가질 때 사용됩니다. SQLD 시험에서는 START WITH, CONNECT BY PRIOR 등의 키워드와 LEVEL의 역할, 그리고 탐색 방향을 정확히 이해하는 것이 중요합니다.
| 키워드 | 개념 | 시험 포인트 |
|---|---|---|
START WITH | 탐색의 시작점(루트 노드) 지정. | 루트 노드가 여러 개일 수 있음. 생략 가능. |
CONNECT BY | 부모-자식 관계를 정의. | PRIOR 키워드 위치에 따라 탐색 방향이 바뀜. |
PRIOR | PRIOR가 붙은 컬럼이 부모 역할을 함. | PRIOR 부모 = 자식 (순방향), 자식 = PRIOR 부모 (역방향) |
LEVEL | 현재 노드의 계층 깊이를 반환. | **루트 노드는 LEVEL 1**부터 시작. 0은 없음. |
ORDER SIBLINGS BY | 형제 노드끼리 정렬하되 계층 구조를 보존. | 일반 ORDER BY는 계층 구조를 파괴하므로 주의. |
SYS_CONNECT_BY_PATH | 루트부터 현재 노드까지의 경로를 문자열로 반환. | 경로 확인 문제에서 자주 등장하는 함수. |
CONNECT BY PRIOR EMP_ID = MGR_IDPRIOR가 EMP_ID에 붙었으므로, EMP_ID(부모)를 통해 MGR_ID(자식)를 찾아 내려갑니다.START WITH MGR_ID IS NULL (최상위 노드)CONNECT BY EMP_ID = PRIOR MGR_IDPRIOR가 MGR_ID에 붙었으므로, MGR_ID(부모)를 통해 EMP_ID(자식)를 찾아 올라갑니다.START WITH EMP_ID = 4 (가장 말단 노드)PRIOR 위치: PRIOR가 붙은 쪽이 부모라는 규칙 하나만 기억하면 순방향/역방향 문제가 쉽게 풀립니다.LEVEL: LEVEL은 1부터 시작한다는 것을 항상 명심해야 합니다.ORDER SIBLINGS BY를 사용해야 합니다.PRIOR = Parent Of It Relation (그 관계의 부모)START WITH → Start (출발점)LEVEL → **L**evel (깊이)ORDER SIBLINGS BY → Sibling (형제)1. 다음 쿼리의 실행 결과로 예상되는 탐색 방향은?
SELECT EMP_ID, MGR_ID
FROM EMP
START WITH MGR_ID = 101
CONNECT BY EMP_ID = PRIOR MGR_ID;
A. MGR_ID = 101인 사원부터 시작하여 부하직원을 찾아 내려가는 순방향 탐색
B. EMP_ID = 101인 사원부터 시작하여 상위 관리자를 찾아 올라가는 역방향 탐색
C. MGR_ID = 101인 사원부터 시작하여 상위 관리자를 찾아 올라가는 역방향 탐색
D. EMP_ID = 101인 사원부터 시작하여 부하직원을 찾아 내려가는 순방향 탐색
2. 계층형 쿼리에서 LEVEL에 대한 설명으로 옳은 것은?
A. 최상위 노드의 LEVEL은 0이다.
B. LEVEL은 계층적 탐색 과정에서 각 노드의 깊이를 나타낸다.
C. LEVEL은 START WITH 절에서 지정할 수 있다.
D. LEVEL을 이용한 조건은 WHERE 절에 사용할 수 없다.
3. 다음 중 계층형 쿼리 실행 시, 형제 노드 간 정렬은 가능하지만 기존 계층 구조가 파괴될 수 있는 구문은?
A. ORDER SIBLINGS BY
B. ORDER BY
C. PARTITION BY
D. GROUP BY
CONNECT BY EMP_ID = PRIOR MGR_ID는 PRIOR가 MGR_ID(부모)에 붙었으므로, MGR_ID를 통해 EMP_ID(자식)를 찾아 올라가는 역방향 탐색입니다. 시작점은 MGR_ID = 101인 노드입니다.LEVEL은 1부터 시작이므로 틀렸습니다. C는 LEVEL은 가상 컬럼이라 START WITH에서 지정할 수 없습니다. D는 WHERE 절에 사용 가능합니다.ORDER BY는 전체 결과를 정렬하므로 계층 구조를 무시합니다. 계층 구조를 유지하려면 ORDER SIBLINGS BY를 사용해야 합니다.