본문 바로가기
일일퀘스트 일일퀘스트

SQLD 시험 문제: 계층형 질의(Hierarchical Query) 구문 구조

ace 읽는 시간 약 8분

계층형 질의란 무엇인가

데이터베이스를 다루다 보면 단순히 평면적인 데이터를 조회하는 것을 넘어, 데이터 간의 상하 관계나 부모 자식 관계를 파악해야 하는 상황을 자주 마주하게 됩니다. 예를 들어 조직도, 메뉴 구조, 게시판의 댓글과 대댓글, BOM(제품 구성 목록) 등이 대표적입니다. 이러한 데이터를 조회하기 위해 SQL에서 제공하는 강력한 도구가 바로 계층형 질의입니다. SQLD 시험에서도 계층형 질의는 데이터 분석의 논리적 사고를 묻는 단골 출제 영역입니다.

계층형 질의는 테이블 내에 존재하는 상위 항목과 하위 항목 간의 관계를 순차적으로 추적하여 결과를 반환합니다. 일반적인 조인(JOIN) 방식으로는 구현하기 어려운 복잡한 관계를 한 번의 쿼리로 해결할 수 있다는 점에서 매우 효율적입니다. 오라클(Oracle) 데이터베이스를 기준으로 설명하자면, START WITH와 CONNECT BY 구문을 사용하여 데이터의 흐름을 제어합니다.

계층형 질의의 핵심 구문 구조

SQLD 시험에서 가장 중요하게 다루는 계층형 질의의 기본 구조는 다음과 같습니다. 이 구문을 정확히 이해하는 것만으로도 문제의 절반 이상을 해결할 수 있습니다.

  • START WITH: 계층 구조가 시작되는 최상위 노드(Root Node)를 지정합니다. 특정 조건을 만족하는 행을 시작점으로 삼습니다.
  • CONNECT BY: 부모 행과 자식 행의 관계를 정의합니다. PRIOR 키워드의 위치에 따라 부모에서 자식으로 내려갈지, 자식에서 부모로 올라갈지가 결정됩니다.
  • ORDER SIBLINGS BY: 계층 구조를 유지하면서 동일한 부모를 가진 자식 행들 사이의 정렬 순서를 결정합니다. 일반 ORDER BY를 사용하면 계층 구조가 깨지기 때문에 반드시 이 구문을 사용해야 합니다.

예를 들어, 사원 테이블에서 사장님을 시작점으로 하여 부하 직원을 차례대로 출력하고 싶다면 START WITH MGR IS NULL CONNECT BY PRIOR EMPNO = MGR과 같이 작성합니다. 여기서 PRIOR가 EMPNO 앞에 붙으면 부모의 사원 번호가 자식의 관리자 번호와 일치해야 한다는 의미가 됩니다.

PRIOR 키워드의 마법과 위치 선정

많은 수험생이 헷갈려하는 부분이 바로 PRIOR의 위치입니다. PRIOR는 ‘이전 행’을 가리키는 키워드입니다. PRIOR 자식 = 부모 형태라면 자식의 부모를 찾아 올라가는 상향식(Bottom-up) 탐색이 되고, 자식 = PRIOR 부모 형태라면 부모로부터 자식을 찾아 내려가는 하향식(Top-down) 탐색이 됩니다. 이 차이를 명확히 이해하는 것이 시험 합격의 핵심입니다.

실생활에서의 활용 사례

계층형 질의는 실무에서 매우 빈번하게 사용됩니다. 단순히 이론으로만 배우는 것이 아니라 어떤 상황에서 쓰이는지 이해하면 학습 효율이 비약적으로 상승합니다.

    • 조직도 관리: 인사 시스템에서 부서별, 직급별 보고 체계를 확인할 때 사용합니다. 특정 부서에 속한 모든 하위 부서를 조회하는 것은 계층형 질의의 가장 기본적인 용도입니다.
    • 제품 구성 관리: 제조 현장에서는 하나의 완제품이 어떤 부품들로 구성되어 있는지, 각 부품은 또 어떤 하위 부품을 가지는지 파악하는 BOM 시스템을 운영합니다. 이를 통해 부품 하나가 단종될 때 영향받는 전체 완제품 목록을 즉각 확인할 수 있습니다.
    • 댓글 시스템: 웹사이트의 게시판에서 원글에 달린 댓글, 그 댓글에 달린 대댓글을 시간순 혹은 구조순으로 출력할 때 필수적입니다. 계층형 질의를 사용하면 대댓글을 원댓글 바로 아래에 위치시키는 정렬을 쉽게 구현할 수 있습니다.

계층형 질의를 유용하게 만드는 가상 컬럼과 함수

오라클은 계층형 질의를 더 편리하게 사용할 수 있도록 몇 가지 유용한 가상 컬럼과 함수를 제공합니다. 이들은 SQLD 시험에서도 자주 등장하므로 반드시 암기해야 합니다.

    • LEVEL: 현재 노드가 계층 구조에서 몇 번째 단계(깊이)에 있는지 나타내는 숫자입니다. 최상위는 1, 그 자식은 2가 됩니다.
    • CONNECT_BY_ISLEAF: 현재 행이 자식이 없는 가장 마지막 노드(Leaf Node)인지 확인합니다. 자식이 없으면 1, 있으면 0을 반환합니다.
    • CONNECT_BY_ROOT: 계층의 시작점인 최상위 행의 값을 가져옵니다. 특정 행이 어떤 최상위 노드에서 시작되었는지 추적할 때 유용합니다.
    • SYS_CONNECT_BY_PATH: 현재 행까지의 경로를 특정 구분자(예: /)로 연결하여 보여줍니다. 경로 정보를 시각화할 때 매우 강력한 도구입니다.

흔한 오해와 사실 관계 바로잡기

계층형 질의를 공부할 때 자주 발생하는 오해 중 하나는 ‘모든 데이터베이스에서 동일한 문법을 사용할 것’이라는 생각입니다. 하지만 이는 사실이 아닙니다. SQLD 시험은 주로 오라클 문법을 기준으로 출제되지만, 실무에서는 사용하는 데이터베이스 엔진에 따라 접근 방식이 다를 수 있습니다.

예를 들어, SQL Server나 MySQL에서는 계층형 질의를 위해 WITH RECURSIVE라는 구문을 사용합니다. 이는 CTE(Common Table Expression)를 이용한 재귀적 쿼리 방식으로, 오라클의 CONNECT BY와는 문법이 완전히 다릅니다. 하지만 ‘데이터의 계층을 추적한다’는 논리적 목적은 동일합니다. 시험 준비 시에는 오라클의 고유 구문을 숙지하되, 원리가 다른 엔진에서도 비슷하게 작동한다는 점을 인지하면 데이터베이스에 대한 전반적인 이해도가 높아집니다.

또한, 많은 사람이 ORDER BY를 사용하면 계층 구조가 유지될 것이라고 생각합니다. 하지만 ORDER BY는 쿼리의 최종 결과물에만 정렬을 적용하므로 부모-자식 관계가 섞여버리게 됩니다. 계층 구조를 유지하며 정렬하고 싶다면 반드시 ORDER SIBLINGS BY를 사용해야 한다는 점을 잊지 마세요.

전문가가 제안하는 학습 팁과 효율적 활용법

계층형 질의를 정복하기 위한 전문가의 조언은 ‘직접 그려보라’는 것입니다. 머릿속으로만 생각하면 PRIOR의 방향성을 놓치기 쉽습니다. 종이에 작은 원(노드)을 그리고 화살표로 연결한 뒤, 쿼리의 조건이 어느 방향으로 흐르는지 화살표를 그려보세요.

  • 시각화 학습법: 테이블 데이터를 종이에 적고, START WITH부터 시작해서 CONNECT BY의 PRIOR 조건에 따라 화살표를 따라가 보세요. 이 과정을 세 번만 반복하면 구조가 눈에 보이기 시작합니다.
  • 데이터의 무결성 체크: 계층형 질의는 데이터에 순환 참조(Cycle)가 발생하면 무한 루프에 빠져 오류를 발생시킵니다. 실무에서는 이러한 문제를 방지하기 위해 NOCYCLE 옵션을 사용하거나 데이터 정합성을 사전에 검증하는 절차를 거칩니다.
  • 불필요한 조인 최소화: 계층형 질의를 사용하면 여러 번의 조인을 반복할 필요가 없습니다. 쿼리가 복잡해 보일 수 있지만, 전체적인 성능 측면에서는 데이터베이스 엔진이 최적화된 내부 연산을 수행하므로 훨씬 경제적입니다.

자주 묻는 질문과 답변

Q: CONNECT BY를 사용할 때 조건절(WHERE)은 어디에 위치해야 하나요?

A: WHERE 절은 계층형 질의가 완료된 결과물에 대해 필터링을 수행합니다. 즉, 전체 계층 구조를 먼저 만들고, 그 결과에서 WHERE 조건에 맞는 행만 추출합니다. 만약 계층 구조를 만들기 전에 중간 단계를 제거하고 싶다면 CONNECT BY 절 뒤에 AND 조건을 추가하여 필터링해야 합니다.

Q: 계층형 질의의 성능 문제는 어떻게 해결하나요?

A: 계층형 질의는 테이블 전체를 스캔하는 경우가 많으므로 부모 컬럼(MGR 등)에 인덱스를 생성하는 것이 매우 중요합니다. 인덱스가 존재하면 데이터베이스가 계층을 탐색할 때 훨씬 빠르게 노드를 이동할 수 있습니다.

Q: LEVEL을 사용하여 특정 깊이의 데이터만 가져오려면 어떻게 하나요?

A: WHERE LEVEL <= 3과 같이 WHERE 절을 사용하여 계층의 깊이를 제한할 수 있습니다. 이는 보고서 작성 시 너무 깊은 하위 항목은 제외하고 싶을 때 매우 유용하게 사용됩니다.

성공적인 시험 준비를 위한 전략

SQLD 시험에서 계층형 질의 문제는 단순히 구문을 맞히는 문제를 넘어, 데이터의 흐름을 논리적으로 추론하는 능력을 요구합니다. 예제 코드를 눈으로만 읽지 말고, 직접 쿼리 작성 도구를 실행하여 LEVEL 값이 어떻게 변하는지, SYS_CONNECT_BY_PATH가 어떤 문자열을 반환하는지 눈으로 확인하는 과정이 필요합니다.

또한, 계층형 질의의 결과 데이터가 일반적인 평면 테이블과 어떻게 다른지 비교해보세요. 결과 데이터셋은 부모가 먼저 나오고 자식이 뒤따르는 순서로 정렬되어 있습니다. 이 특성을 이해하면 SQLD 시험의 객관식 문제에서 정답을 골라내는 속도가 훨씬 빨라질 것입니다. 꾸준한 연습과 원리에 대한 깊은 이해가 있다면 계층형 질의는 가장 강력한 무기가 될 것입니다.

ace

ace
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

error: Content is protected !!

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.