계층형 쿼리 개념에 대해서 이야기해봅시다.
계층형 쿼리 개념에 대해 알기
계층형 쿼리(Hierarchical Query)는 데이터베이스(DataBase)의 SQL(Structured Query Language)에서 테이블에 계층적 구조와 수직적 구조가 존재할 때 데이터를 조회하기 위한 쿼리를 의미합니다.
계층형 쿼리에서는 계층적인 순서로 표현해야 하는 데이터의 수직적 구조가 존재하는 경우 이러한 계층적 구조의 테이블 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용하게 됩니다.
계층형 쿼리는 회사 조직도와 같이 계층적 구조를 가지고 있는 테이블과 데이터에서 사용할 수 있습니다.
회사 조직도를 보면 회사, 그리고 본부, 그리고 부서, 그리고 부서장과 부서원들로 구성되어 있습니다. 여기서 회사는 가장 최상위 계층이 되고 회사를 중심으로 IT본부, 디지털 본부, 경영지원본부와 같은 본부 레벨이 있고 그 하위로 IT개발부, IT기획부, 정보보호부, 디지털사업부, 영업부, 상품부, 재무기획부, 회계부, 전략기획부, 업무지원부 등 다양한 부서들의 레벨로 구성되어 있습니다. 이렇게 회사 조직도에는 최상위 계층에서부터 하위 계층이 생성되어 있습니다. 이러한 경우와 같이 계층 구조의 데이터를 출력시키고자 할 때 계층형 쿼리를 사용하는 것입니다.
계층형 쿼리에서 사용하는 특수 구문 5가지가 존재합니다. 계층형 쿼리에서 사용하는 특수 구문 5가지는 LEVEL, SYS_CONNECT_BT_PATH, START WITH, CONNECT BY, PRIOR 입니다.
[계층형 쿼리에서 사용하는 특수 구문]
구분 | 내용 |
1 | LEVEL |
2 | SYS_CONNECT_BT_PATH |
3 | START WITH |
4 | CONNECT BY |
5 | PRIOR |
[계층형 쿼리 사용 예시]
SELECT 컬럼1, SYS_CONNECT_BY_PATH(컬럼, 구분자) AS ALIAS 명
FROM 테이블 명
WHERE 조건절
START WITH 조건식
CONNECT BY PRIOR 조건식
계층형 쿼리 개념에 대한 설명
계층형 쿼리(Hierarchical Query)는 테이블(Table)에 계층 구조를 이루는 컬럼이 존재하는 경우 계층 퀴리를 사용하여 데이터를 출력할 수 있도록 해줍니다. 계층형 쿼리는 한 테이블에 담겨져 있는 여러 레코드들이 서로 상하 관계의 계층 관계를 이루고 있을 때 이러한 상하 관계에 따라 상위와 하위의 계층 구조로 데이터를 조회하기 위해서 사용하는 SQL 쿼리입니다.
계층형 쿼리는 계층 관계를 나타내는 쿼리문입니다. 계층형 쿼리를 사용할 경우, 별도의 조인(JOIN)이나 셀프 조인(Self Join)이 없어도 계층 구조를 출력할 수 있게 됩니다.
계층형 쿼리에서는 특수한 구문을 사용합니다. 계층형 쿼리의 특수 구문에는 5가지가 있습니다. 계층형 쿼리의 특수 구문 5가지는 LEVEL, SYS_CONNECT_BT_PATH, START WITH, CONNECT BY, PRIOR 입니다.
[계층형 쿼리의 특수 구문 정리]
구분 | 내용 |
LEVEL | 현재의 DEPTH를 반환, 루트 노드는 1 |
SYS_CONNECT_BY_PATH(컬럼, 구분자) | 루트 노드부터 현재 노드까지의 경로를 출력하는 함수 |
START WITH | 경로가 시작되는 루트 노드를 생성해주는 절 |
CONNECT BY | – 루트로부터 자식 노드를 생성해주는 절 – 조건에 만족하는 데이터가 없을 때까지 노드를 생성 |
PRIOR | 바로 앞에 있는 부모 노드의 값을 반환 |
LEVEL은 계층 구조 쿼리에서 수행 결과의 뎁스(Depth)를 표현하는 컬럼입니다. 현재 데이터 행이 몇 번째의 레벨인지를 표시해주는 값입니다. 이는 계층형 쿼리에서만 존재하는 모조 컬럼입니다. 즉 LEVEL은 현재 테이블에는 존재하지 않는 컬럼입니다. LEVEL을 통해 계층형 구조를 쉽게 표현할 수 있게 됩니다.
SYS_CONNECT_BT_PATH는 루트 데이터로부터 현재 전개할 데이터까지의 경로를 표시해주는 함수입니다. SYS_CONNECT_BT_PATH는 뒤에 컬럼명과 경로 분리자를 넣어서 작성합니다.
START WITH는 계층 구조 전개의 시작 위치를 지정하는 구문입니다. START WITH는 계층의 루트로 사용될 행을 지정합니다. START WITH는 서브 쿼리로도 사용할 수 있습니다. START WITH는 어떤 레코드를 최상위 레코드로 정할지를 결정하는 쿼리문입니다.
CONNECT BY는 연결고리를 만드는 쿼리문입니다. CONNECT BY는 부모와 자식의 관계를 지정합니다. CONNECT BY는 하위 데이터를 PRIOR를 사용하여 지정할 수 있습니다. CONNECT BY는 현재 전개할 데이터의 루트 데이터를 표시하는 함수입니다.
PRIOR는 CONNECT BY와 함께 사용합니다. PRIOR 자식 = 부모로 사용하면 부모에서 자식으로 순방향 전개됩니다. PRIOR 부모 = 자식으로 사용하면 계층 구조가 자식 데이터에서 부모 데이터 방향으로 전개되는 역방향 전개를 하게 됩니다. 즉, PRIOR에 지정된 컬럼이 맞은편 컬럼을 찾아가는 구조입니다. 여기서 NOCYCLE 파라미터를 이용하면 무한 루프를 방지할 수 있습니다.
계층쿼리의 순방향 전개는 루트(상위)에서 리프(하위)로 내려가는 구조라는 것을 의미합니다. 반대로 계층쿼리의 역방향 전개는 리프(하위)에서 루트(상위)로 올라가게 하는 것입니다.
계층을 이루는 데이터를 정렬해주기 위해서는 ORDER SIBLINGS BY 절을 사용합니다. SIBLINGS는 형제들끼리 정렬한다는 것을 의미합니다. 계층 쿼리에서는 ORDER BY절을 사용하면 계층과 상관 없이 전체 정렬이 되기 때문에 계층 구조를 유지할 수 없습니다. ORDER SIBLINGS BY 절을 사용하면 같은 레벨들끼리 정렬을 수행하기 때문에 계층 구조를 유지할 수 있게 되는 것입니다.
계층형 쿼리(Hierarchical Query)는 오라클(Oracle)의 고급 쿼리로 볼 수 있습니다.