2026 SQLD 필기 2과목 2장 6~8절 | 계층형 질의·셀프 조인·PIVOT·정규표현식 — 핵심 이론
데이터위자드 ·
필기 · 핵심 이론
SQL 활용 마지막 절은 데이터의 모양과 탐색 방법을 바꾸는 기능입니다. 조직도를 내려가는 계층 탐색, 같은 테이블의 역할을 나누는 셀프 조인, 세로 집계를 가로로 펴는 PIVOT, 문자열 패턴을 검사하는 정규표현식을 구분합니다.
셀프 조인 · Oracle 계층형 질의 · PIVOT과 집계 · UNPIVOT의 방향 · 정규표현식 기호
1. 셀프 조인
셀프 조인은 같은 테이블을 서로 다른 별칭으로 참조해 연결합니다. 직원 e와 관리자 m을 e.manager_id=m.id로 연결하면 한 행에 직원명과 관리자명을 함께 표시할 수 있습니다. 실제 테이블을 복제하거나 관리자 컬럼을 영구 추가하는 것은 아닙니다.
최상위 직원은 관리자 ID가 NULL일 수 있으므로 모두 보려면 직원 기준 LEFT JOIN을 검토합니다. 역할별 컬럼을 한정하지 않으면 이름이 모호해질 수 있습니다.
셀프 조인은 같은 테이블을 역할별 별칭으로 구분하여 연결한다.
예제로 적용하기
모든 직원과 관리자명을 표시하되 대표이사도 남긴다. 적절한 조인은?
풀이와 판단 과정
결론: 직원 e LEFT JOIN 직원 m ON e.manager_id=m.id
관리자가 없는 직원도 왼쪽 기준으로 보존해야 하므로 LEFT JOIN이 적절합니다.
2. Oracle 계층형 질의
START WITH는 시작 행, CONNECT BY는 부모·자식 연결 규칙을 정합니다. 부모에서 자식으로 내려갈 때 PRIOR id=parent_id처럼 부모 쪽 값을 PRIOR로 표시할 수 있습니다. LEVEL은 루트에서 1부터 시작하는 깊이입니다.
PRIOR가 어느 컬럼 앞에 있는지에 따라 탐색 방향이 달라집니다. ORDER SIBLINGS BY는 형제 간 순서를 지정하면서 계층 구조를 유지할 때 씁니다. 순환 관계가 있으면 NOCYCLE 등 지원 기능과 데이터 규칙을 함께 확인합니다.
START WITH는 루트를 선택하고 CONNECT BY는 계층 연결 조건을 정한다.
예제로 적용하기
Oracle 계층 질의에서 루트의 LEVEL 값은?
풀이와 판단 과정
결론: 1
루트는LEVEL1이고 자식으로 내려갈 때 깊이가 증가합니다.
3. PIVOT과 집계
PIVOT은 특정 열의 값들을 결과 열로 펼치면서 집계합니다. 월·지역·금액 자료에서 월 값을 열로 바꾸면 지역별 1월·2월 금액을 나란히 볼 수 있습니다. 펼칠 컬럼과 집계값, 남는 그룹 컬럼을 구분해야 합니다.
같은 지역·월에 여러 행이 있다면 SUM 같은 집계 기준이 필요합니다. 단순히 행과 열의 표시만 바꾸는 것이 아니라 중간 집계가 포함될 수 있다는 점이 중요합니다. 제품별 PIVOT 문법은 다릅니다.
PIVOT은 값의 범주를 열로 펼치며 집계를 수행할 수 있다.
예제로 적용하기
서울 1월 10·20,서울 2월 5를 월별SUM PIVOT하면?
풀이와 판단 과정
결론: 서울의 1월 30,2월 5
같은 지역·월의 값을 합산해 1월 30과 2월 5를 가로로 표시합니다.
4. UNPIVOT의 방향
UNPIVOT은 여러 열의 값을 범주·값 형태의 행으로 풀어냅니다. 1월·2월 열을 월·금액 행으로 바꿀 수 있습니다. 이미 집계되어 사라진 원본 상세 행까지 되살리는 역연산은 아닙니다.
NULL을 포함할지 제외할지는 제품별 옵션을 확인합니다. PIVOT 뒤 UNPIVOT을 했다고 최초 상세 거래 수가 복구된다고 보지 마세요. 합계 30에서 원본 10과 20의 구성을 알 수 없기 때문입니다.
UNPIVOT은 여러 열을 범주·값 형태의 행으로 펼친다.
예제로 적용하기
PIVOT 합계 30을 UNPIVOT하면 원본 10과 20의 두 거래가 자동 복원되는가?
풀이와 판단 과정
결론: 아니다. 집계로 잃은 상세는 복원되지 않는다.
UNPIVOT은 형태를 세로로 바꿀 뿐 합계를 구성한 개별 상세 값을 알 수 없습니다.
5. 정규표현식 기호
정규표현식의 ^와 $는 시작·끝 경계, [0-9]는 숫자 한 글자, +는 한 번 이상 반복을 나타냅니다. ^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 검사하는 패턴입니다. LIKE의 %·_와 섞지 마세요.
Oracle은 REGEXP_LIKE 등 함수를 제공하고 PostgreSQL 등은 다른 연산자·함수를 사용할 수 있습니다. 대소문자·개행·이스케이프 규칙도 제품별로 확인합니다. 패턴은 먼저 짧은 반례로 검증하면 이해가 쉽습니다.
^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 뜻한다.
예제로 적용하기
패턴 ^[0-9]+$와 일치하는 문자열은?
풀이와 판단 과정
결론: 123
시작부터 끝까지 숫자가 하나 이상 있어야 하므로 123만 일치합니다.
한눈에 비교하기
| 기능 | 목적 | 주의 |
|---|---|---|
| 셀프 조인 | 동일 테이블 역할 연결 | 별칭·외부 조인 |
| CONNECT BY | 계층 탐색 | PRIOR 방향·LEVEL |
| PIVOT | 범주를 열로 | 집계 단위 |
| UNPIVOT | 열을 행으로 | 상세 복원 아님 |
| 정규표현식 | 문자 패턴 | LIKE와 구분 |
순서대로 풀어 보는 예제
조직이 대표 1–팀장 2–사원 3 구조라면 대표를 루트로 내려가는 계층의 LEVEL은 1·2·3입니다. 셀프 조인으로는 직원과 직접 관리자 한 단계를 붙이고, 계층 질의로는 여러 깊이를 탐색할 수 있습니다.
별도 매출표가 서울·1월 10,서울·1월 20,서울·2월 5이면 PIVOT으로 1월 30·2월 5를 표시합니다. UNPIVOT을 해도 1월 30이라는 집계 행으로 돌아갈 뿐 두 원래 거래로 나뉘지는 않습니다.
-- Oracle 계층형 질의
SELECT id,name,LEVEL
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR id=manager_id
ORDER SIBLINGS BY id;헷갈리는 문장 바로잡기
셀프 조인
잘못된 판단 셀프 조인은 원본을 반드시 물리 복제한다.
올바른 판단: 셀프 조인은 같은 테이블을 역할별 별칭으로 구분하여 연결한다.
Oracle 계층형 질의
잘못된 판단 LEVEL은 루트에서 0으로 고정된다.
올바른 판단: START WITH는 루트를 선택하고 CONNECT BY는 계층 연결 조건을 정한다.
PIVOT과 집계
잘못된 판단 PIVOT은 어떤 경우에도 집계하지 않는다.
올바른 판단: PIVOT은 값의 범주를 열로 펼치며 집계를 수행할 수 있다.
UNPIVOT의 방향
잘못된 판단 UNPIVOT은 집계 전 상세 행을 항상 완벽 복원한다.
올바른 판단: UNPIVOT은 여러 열을 범주·값 형태의 행으로 펼친다.
정규표현식 기호
잘못된 판단 ^는 언제나 문자열 끝이다.
올바른 판단: ^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 뜻한다.
이론을 정리했다면 같은 절의 객관식 문제에서 조건과 예외를 확인하세요. 정답을 고른 뒤에는 틀린 선택지가 왜 성립하지 않는지도 설명해 보세요.
핵심 개념 확인 — 객관식 5문제
설명을 읽은 뒤 아래 다섯 문항을 풀어 보세요. 정답을 고르고 틀린 선택지의 오류도 설명할 수 있으면 이 단원의 기준을 이해한 것입니다.
문제 1
계층형 질의·셀프 조인·PIVOT·정규표현식에서 셀프 조인에 대한 설명으로 옳은 것은?
- ① 셀프 조인은 원본을 반드시 물리 복제한다.
- ② 관리자 없는 직원은 INNER JOIN에서 항상 남는다.
- ③ 같은 테이블에는 별칭을 두 개 쓸 수 없다.
- ④ 셀프 조인은 같은 테이블을 역할별 별칭으로 구분하여 연결한다.
정답과 해설 보기
정답 ④
셀프 조인은 같은 테이블을 서로 다른 별칭으로 참조해 연결합니다. 직원 e와 관리자 m을 e.manager_id=m.id로 연결하면 한 행에 직원명과 관리자명을 함께 표시할 수 있습니다. 실제 테이블을 복제하거나 관리자 컬럼을 영구 추가하는 것은 아닙니다. 최상위 직원은 관리자 ID가 NULL일 수 있으므로 모두 보려면 직원 기준 LEFT JOIN을 검토합니다. 역할별 컬럼을 한정하지 않으면 이름이 모호해질 수 있습니다.
셀프 조인은 같은 테이블을 역할별 별칭으로 구분하여 연결한다.
문제 2
계층형 질의·셀프 조인·PIVOT·정규표현식에서 Oracle 계층형 질의에 대한 설명으로 옳은 것은?
- ① START WITH는 루트를 선택하고 CONNECT BY는 계층 연결 조건을 정한다.
- ② PRIOR 위치는 탐색 방향과 무관하다.
- ③ LEVEL은 루트에서 0으로 고정된다.
- ④ ORDER SIBLINGS BY는 모든 계층 관계를 삭제한다.
정답과 해설 보기
정답 ①
START WITH는 시작 행, CONNECT BY는 부모·자식 연결 규칙을 정합니다. 부모에서 자식으로 내려갈 때 PRIOR id=parent_id처럼 부모 쪽 값을 PRIOR로 표시할 수 있습니다. LEVEL은 루트에서 1부터 시작하는 깊이입니다. PRIOR가 어느 컬럼 앞에 있는지에 따라 탐색 방향이 달라집니다. ORDER SIBLINGS BY는 형제 간 순서를 지정하면서 계층 구조를 유지할 때 씁니다. 순환 관계가 있으면 NOCYCLE 등 지원 기능과 데이터 규칙을 함께 확인합니다.
START WITH는 루트를 선택하고 CONNECT BY는 계층 연결 조건을 정한다.
문제 3
계층형 질의·셀프 조인·PIVOT·정규표현식에서 PIVOT과 집계에 대한 설명으로 옳은 것은?
- ① PIVOT은 값의 범주를 열로 펼치며 집계를 수행할 수 있다.
- ② PIVOT은 부모·자식 탐색 함수다.
- ③ PIVOT은 문자열을 정규식으로 검사한다.
- ④ PIVOT은 어떤 경우에도 집계하지 않는다.
정답과 해설 보기
정답 ①
PIVOT은 특정 열의 값들을 결과 열로 펼치면서 집계합니다. 월·지역·금액 자료에서 월 값을 열로 바꾸면 지역별 1월·2월 금액을 나란히 볼 수 있습니다. 펼칠 컬럼과 집계값, 남는 그룹 컬럼을 구분해야 합니다. 같은 지역·월에 여러 행이 있다면 SUM 같은 집계 기준이 필요합니다. 단순히 행과 열의 표시만 바꾸는 것이 아니라 중간 집계가 포함될 수 있다는 점이 중요합니다. 제품별 PIVOT 문법은 다릅니다.
PIVOT은 값의 범주를 열로 펼치며 집계를 수행할 수 있다.
문제 4
계층형 질의·셀프 조인·PIVOT·정규표현식에서 UNPIVOT의 방향에 대한 설명으로 옳은 것은?
- ① UNPIVOT은 집계 전 상세 행을 항상 완벽 복원한다.
- ② UNPIVOT은 기본키를 자동 생성한다.
- ③ UNPIVOT은 여러 열을 범주·값 형태의 행으로 펼친다.
- ④ UNPIVOT은 SQL 문장을 취소한다.
정답과 해설 보기
정답 ③
UNPIVOT은 여러 열의 값을 범주·값 형태의 행으로 풀어냅니다. 1월·2월 열을 월·금액 행으로 바꿀 수 있습니다. 이미 집계되어 사라진 원본 상세 행까지 되살리는 역연산은 아닙니다. NULL을 포함할지 제외할지는 제품별 옵션을 확인합니다. PIVOT 뒤 UNPIVOT을 했다고 최초 상세 거래 수가 복구된다고 보지 마세요. 합계 30에서 원본 10과 20의 구성을 알 수 없기 때문입니다.
UNPIVOT은 여러 열을 범주·값 형태의 행으로 펼친다.
문제 5
계층형 질의·셀프 조인·PIVOT·정규표현식에서 정규표현식 기호에 대한 설명으로 옳은 것은?
- ① LIKE의%와 정규식의+는 모든 문맥에서 같다.
- ② ^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 뜻한다.
- ③ ^는 언제나 문자열 끝이다.
- ④ +는 0번 반복만 뜻한다.
정답과 해설 보기
정답 ②
정규표현식의 ^와 $는 시작·끝 경계, [0-9]는 숫자 한 글자, +는 한 번 이상 반복을 나타냅니다. ^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 검사하는 패턴입니다. LIKE의 %·_와 섞지 마세요. Oracle은 REGEXP_LIKE 등 함수를 제공하고 PostgreSQL 등은 다른 연산자·함수를 사용할 수 있습니다. 대소문자·개행·이스케이프 규칙도 제품별로 확인합니다. 패턴은 먼저 짧은 반례로 검증하면 이해가 쉽습니다.
^[0-9]+$는 전체가 한 자리 이상 숫자인 문자열을 뜻한다.
범위 확인
2026년 학습 범위를 기준으로 구성했습니다. 시험 시행기관의 자격 안내·출제 기준에서 과목과 변경 공지를 확인할 수 있습니다.
SQLD 전체 목차
과목별 이론
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
단원별 객관식
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
실습
- SQL 학습 실습 1 · 6작업 · SELECT·조건·정렬
- SQL 학습 실습 2 · 6작업 · NULL·COUNT·평균
- SQL 학습 실습 3 · 6작업 · 날짜 범위·문자 조건
- SQL 학습 실습 4 · 6작업 · GROUP BY·HAVING·조건부 합계
- SQL 학습 실습 5 · 6작업 · 조인·행 수·미주문 고객
- SQL 학습 실습 6 · 6작업 · 서브쿼리·EXISTS·NOT EXISTS
- SQL 학습 실습 7 · 6작업 · 순위·동률·고객별 Top N
- SQL 학습 실습 8 · 6작업 · 집합 연산·조건부 피벗·전체 검산