공든탑앱 열기

계층형 질의

SQLD (SQL 개발자) · Top N·계층형 질의·PIVOT·정규 표현식 · 약 16분

쉽게 말하면

계층형 질의는 족보처럼 위아래로 이어진 데이터를 나무 모양으로 따라가며 읽는 방법이에요. 어디서 시작할지(START WITH)와 부모와 자식을 어떻게 잇는지(CONNECT BY PRIOR)만 정하면, 사장부터 아래 직원까지 차례로 펼쳐 줘요. LEVEL은 몇 단계 아래인지 알려 줘요.

시험용 정의

계층형 질의는 자기 자신을 가리키는 테이블(사원-관리자, 부서-상위부서)을 트리 모양으로 따라가며 조회한다. Oracle은 START WITH(루트가 될 행), CONNECT BY PRIOR(부모와 자식을 잇는 조건)로 쓰고, 각 행의 깊이 LEVEL(루트 = 1), 잎 여부 CONNECT_BY_ISLEAF, 루트부터의 경로 SYS_CONNECT_BY_PATH를 함께 볼 수 있다.

비유로 이해하기

족보 펼치기다. START WITH는 '시조부터 시작', CONNECT BY PRIOR는 '부모의 이름 = 자식의 아버지 칸'이라는 연결 규칙, LEVEL은 몇 대손인지, ISLEAF는 자식이 없는 사람인지다.

자세히

먼저 알아 둘 말

말뜻
루트트리의 맨 위 행. START WITH 조건으로 정한다
리프(잎)자식이 없는 맨 아래 행
PRIORCONNECT BY에서 '이전에 읽은 부모 행'의 열을 가리키는 키워드
순방향 / 역방향부모 → 자식(위에서 아래) / 자식 → 부모(아래에서 위)

문법과 가상 열

구문뜻
START WITH 조건루트 행. 생략하면 모든 행이 각각 루트가 된다
CONNECT BY PRIOR 자식키 = 부모키순방향: PRIOR empno = mgr (부모 empno = 자식 mgr)
CONNECT BY PRIOR 부모키 = 자식키역방향: PRIOR mgr = empno (아래에서 위로)
LEVEL루트 1, 자식 2, 손자 3…
CONNECT_BY_ISLEAF리프면 1, 아니면 0
CONNECT_BY_ROOT 열그 행의 루트 값
SYS_CONNECT_BY_PATH(열, '/')루트부터 현재까지 경로: /KIM/LEE/CHOI
ORDER SIBLINGS BY 열트리 모양을 유지하며 같은 부모의 형제끼리만 정렬
NOCYCLE순환(자기 조상을 다시 만남)이 있어도 멈추지 않고 건너뛴다

알아 둘 점

  • PRIOR 위치로 방향을 판단한다: PRIOR 자식쪽키(empno) = 부모쪽키(mgr)면 아래로, 반대면 위로
  • WHERE 절은 트리를 다 만든 뒤에 행을 거른다. 거른 행의 자식은 남는다. 가지째 빼려면 CONNECT BY에 조건을 넣는다
  • 그냥 ORDER BY를 쓰면 트리 순서가 깨진다. 트리를 유지하려면 ORDER SIBLINGS BY
  • SQL Server는 CTE(WITH) 재귀 쿼리로 계층을 조회한다

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr는 트리를 어느 방향으로 따라갈까요?

  1. 관리자 → 부하 (아래로)
  2. 부하 → 관리자 (위로)
  3. 방향 없이 전체
  4. 같은 레벨끼리 옆으로
정답 보기

1번 관리자 → 부하 (아래로)

PRIOR가 붙은 쪽이 이미 읽은 부모 행이다. PRIOR empno = mgr는 "부모의 사번 = 자식의 관리자 사번"이라 위에서 아래로(순방향) 내려간다. 루트는 관리자가 없는 사원(KIM).

Q2. START WITH empno = 1004 CONNECT BY PRIOR mgr = empno는 무엇을 조회하나? (1004는 CHOI)

  1. CHOI의 부하들
  2. 전체 조직도
  3. CHOI와 같은 레벨 사원
  4. CHOI와 그 위 관리자들
정답 보기

4번 CHOI와 그 위 관리자들

PRIOR가 mgr(부모 쪽 키) 앞에 있어 자식 → 부모 역방향. CHOI, LEE, KIM.

Q3. 계층형 질의에서 WHERE 절에 대한 설명으로 옳은 것은?

  1. 트리를 만들기 전에 루트를 정한다
  2. 트리를 만든 뒤 해당 행만 걸러 내고, 그 자식은 남을 수 있다
  3. WHERE는 쓸 수 없다
  4. WHERE 조건에 맞지 않으면 가지 전체가 빠진다
정답 보기

2번 트리를 만든 뒤 해당 행만 걸러 내고, 그 자식은 남을 수 있다

가지째 빼려면 CONNECT BY 조건에 넣는다.

Q4. 루트에서 현재 행까지 이름을 '/'로 이어 붙여 보여 주는 함수는?

  1. CONNECT_BY_ROOT
  2. LISTAGG
  3. CONNECT_BY_ISLEAF
  4. SYS_CONNECT_BY_PATH
정답 보기

4번 SYS_CONNECT_BY_PATH

SYS_CONNECT_BY_PATH(열, '/').

Q5. 계층형 질의에서 LEVEL 값이 1인 행은?

  1. 두 번째 단계 행
  2. START WITH로 정한 루트 행
  3. 자식이 없는 잎 행
  4. 마지막에 나온 행
정답 보기

2번 START WITH로 정한 루트 행

루트가 1이고 아래로 내려갈수록 1씩 커진다.

Q6. CONNECT BY 절에 조건을 더해 어떤 행을 제외하면?

  1. 오류가 난다
  2. 그 행과 아래 가지가 함께 빠진다
  3. 그 행만 빠지고 아래 자식은 남는다
  4. 결과에 영향이 없다
정답 보기

2번 그 행과 아래 가지가 함께 빠진다

CONNECT BY 조건은 가지째 뺀다. WHERE는 트리를 만든 뒤 그 행만 거른다.

헷갈리기 쉬운 O·X

계층형 질의에서 루트 행의 LEVEL은 0이다.

정답 보기

X 루트는 1이다.

ORDER SIBLINGS BY는 계층 구조를 유지하면서 형제 노드끼리 정렬한다.

정답 보기

O 그냥 ORDER BY는 트리 순서를 깨뜨린다.

CONNECT_BY_ISLEAF는 자식이 있는 행에서 1을 돌려준다.

정답 보기

X 자식이 없는 리프에서 1.

함께 보면 좋은 개념