SQLD발행일 2024. 11. 15.원본 https://blog.naver.com/jword_/223662079862 ↗

[SQLD] 계층형 질의(Hierarchical query), start with, connect by prior, order siblings by

[SQLD] 계층형 질의(Hierarchical query), start with, connect by prior, order siblings by — #SQLD #개발자의도구들 #SQL계층형질의 #SQLstartwith #sqlconnectby…

#SQLD#Naver Blog

#SQLD #개발자의도구들 #SQL계층형질의 #SQLstartwith #sqlconnectby #sqloredersiblingsby

​

24년도 SQLD 제 55회 시험을 대비하며 정리한 글입니다.

\* 본글은 PC버전에 최적화 되어있습니다.

​

**\* **전체 목차는 여기를 참고해주세요.

​

계층형 질의

SQL자격검정 실전문제

SQLD를 공부하면서 처음으로 계층형 질의에 대해서 공부했습니다. 생각보다 쉬우면서도 실용적인 내용이라서 단순 자격증을 위해서가 아닌, 실전에서도 사용될 여지가 충분히 있다고 생각됩니다.

​

계층형 데이터?

DEF

👉 핵심정리계층형 질의 = 테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해 사용함계층형 데이터: 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터

이미지

계층형 데이터는 보통 쇼핑몰의 카테고리에 많이 사용된다고 합니다. 정확한 이해를 위해서는 아래 데이터 표를 보시면 될 것 같습니다.

이미지

javascript 코드 예제
                                    계층형 데이터 구조 정리

회사
 |--- IT부서
        |--- 개발팀
               |----- 백엔드
               |----- 프론트엔드
        |--- 디자인 팀

이런식의 Tree로 보시면 됩니다. ORCLE에서는 LEVEL이라는 예약어가 등록되어 있는데, 이는 pseudocolumn이라고 합니다. 영어로는 어려운데, 그냥 쉽게 말해서 루트노드는 LEVEL 1, 그 자식은 LEVEL 2, 손자는 LEVEL 3... 이런식으로 깊어질 수록 LEVEL이 올라간다고 보시면됩니다.

명령어 정리

이제 본격적으로 계층별 질의에 대해서 알아봅시다.

👉 핵심정리 START WITH : 질의의 시작을 어디로 할지 정의CONNECT BY: 자식 = 부모 CONNECT BY는 어떻게 계층을 엮을지에 관한 것인데, 보통 자식 = 부모 순으로 입력합니다.PRIOR: 우선순위를 지정자식에 우선순위를 지정하면 순방향부모에 우선순위를 지정하면 역방향ORDER SIBLINGS BY 같은 LEVEL의 형제들을 정렬하는데 사용됩니다.ASC(DEFAULT)): 가나다 순서DESC: 역순

​

코드 실습

​

이건 직접 해보면 이해가 되므로 아래 코드를 참고해주세요.

javascript 코드 예제
                                    select
    LPAD(' ', 3 * (LEVEL)) || name as department_hierarchy,  -- form을 지정
    id,
    parent_id,
    LEVEL
FROM
    hierarchy_departments
start with
     parent_id is null    -- 어디서 시작할건지?
connect by
     prior id = parent_id -- 자식: id, 부모: parent_id
order siblings by         -- name 기준으로 가, 나, 다 순서로 정렬
    name;

이미지

javascript 코드 예제
                                    💡 LPAD는 이해를 쉽게하기 위하여 임의로 설정한 것인데, SQLD에서는 LPAD 설정없이 나오기 때문에
기본으로 출력해보는 것이 필요합니다.

이미지

no lpad 결과

​

​

벡엔드 부터 역방향으로

javascript 코드 예제
                                    select
    LPAD(' ', 3 * (LEVEL)) || name as department_hierarchy,
    id,
    parent_id,
    LEVEL
FROM
    hierarchy_departments
start with
     name = '백엔드'   -- 여기서 시작해
connect by
     id = prior parent_id -- 역방향으로 올라갈거야.
order siblings by
    name;

​

이미지

이미지

왼쪽은 no lpad

직접 코드를 만져보면서 여러 가지를 시도해보세요!

사용된 코드 정리

환경: Oracle DB

테이블 생성

javascript 코드 예제
                                    CREATE TABLE hierarchy_departments(
    id NUMBER(19) PRIMARY KEY,
    name VARCHAR2(20) NOT NULL,
    parent_id NUMBER(19)
);

값 넣기

javascript 코드 예제
                                    INSERT ALL
    INTO hierarchy_departments (id, name, parent_id) VALUES (1, '회사', NULL)
    INTO hierarchy_departments (id, name, parent_id) VALUES (2, 'IT 부서', 1)
    INTO hierarchy_departments (id, name, parent_id) VALUES (3, '개발팀', 2)
    INTO hierarchy_departments (id, name, parent_id) VALUES (4, '디자인팀', 2)
    INTO hierarchy_departments (id, name, parent_id) VALUES (5, '프론트엔드', 3)
    INTO hierarchy_departments (id, name, parent_id) VALUES (6, '백엔드', 3)
SELECT * FROM dual;

계층형 질의

javascript 코드 예제
                                    select
    LPAD(' ', 3 * (LEVEL)) || name as department_hierarchy,
    id,
    parent_id,
    LEVEL
FROM
    hierarchy_departments
start with
     parent_id is null
connect by
     prior id = parent_id
order siblings by
    name;

문재풀이

심화내용

👉 핵심정리 오라클의 계층형 질의문에서 PRIOR 키워드는 CONNECT, SELECT, WHERE 절 모두에서 사용이 가능하다.오라클의 계층형 질의문에서 WHERE절은 모든 전개를 진행 후 필터조건으로 만족하는 데이터를 추출한다.​👉 SQL ServerSQL SERVER에서 계층형 질의문은 CTB(Common Table Expression)를 재귀 호출하여 구조를 전개계층형 질의문은 앵커 멤버를 실행하여 기본결과 집합을 만들고, 이후 재귀 멤버를 지속적으로 호출
javascript 코드 예제
javascript 코드 예제
javascript 코드 예제

​