SQLD 시험 합격 전략 요약
윈도우 함수와 그룹 함수는 결과값 차이를 정확히 구분하는 것이 핵심입니다. RANK vs DENSE_RANK vs ROW_NUMBER의 차이, ROLLUP과 CUBE의 Subtotal 생성 방식을 반드시 암기하세요. 옵티마이저와 인덱스 파트는 개념 위주로 출제되므로 용어 정의를 정확히 알아두면 됩니다.
1. 그룹 함수 (ROLLUP, CUBE, GROUPING SETS)
초압축 암기 요약
ROLLUP: N개 칼럼이면 N+1 Level Subtotal 생성, 인수 순서 중요.
CUBE: 결합 가능한 모든 값의 다차원 집계, 시스템 부하 큼.
GROUPING SETS: 인수들의 개별 집계, 다양한 소계 가능.
GROUPING 함수: Subtotal의 total 생성 여부 판별.
초보자 이해용 상세 설명
ROLLUP: GROUP BY와 함께 사용하여 소계(Subtotal)를 생성합니다. Grouping Columns의 수가 N이면 N+1 Level의 Subtotal이 생성됩니다.
인수의 순서에 따라 결과가 달라지므로 주의해야 합니다.
CUBE: 결합 가능한 모든 값에 대해 다차원 집계를 생성합니다. ROLLUP보다 더 많은 조합의 소계를 만들기 때문에 시스템 부하가 더 큽니다.
GROUPING SETS: 인수들에 대한 개별 집계를 구할 수 있으며, 다양한 소계 집합을 원하는 대로 생성할 수 있습니다.
시험 출제 포인트: ROLLUP의 “N+1 Level Subtotal”과 “인수 순서 중요”가 자주 출제됩니다. CUBE와 ROLLUP의 차이를 묻는 문제도 단골입니다.
2. 윈도우 함수
초압축 암기 요약
순위 함수: RANK(1,2,2,4), DENSE_RANK(1,2,2,3), ROW_NUMBER(1,2,3,4 고유).
집계: SUM, MAX, MIN, AVG, COUNT를 파티션별로 사용 가능.
FIRST_VALUE/LAST_VALUE, LAG/LEAD는 SQL Server 미지원.
NTILE은 N등분. RATIO_TO_REPORT는 백분율(0< , <=1).
초보자 이해용 상세 설명
정의: 윈도우 함수는 행과 행 간의 관계를 정의하거나 비교, 연산하는 함수입니다. GROUP BY 없이도 행별로 집계 값을 구할 수 있습니다.
순위 함수 비교:
| 함수 | 동일 값 처리 | 결과 예시 |
|---|---|---|
| RANK | 동일 순위 부여, 다음 순위 건너뜀 | 1, 2, 2, 4 |
| DENSE_RANK | 동일 순위 부여, 다음 순위 연속 | 1, 2, 2, 3 |
| ROW_NUMBER | 고유한 순위 부여 | 1, 2, 3, 4 |
윈도우 집계 함수:
- SUM: 파티션별 합계 (예: 같은 매니저를 둔 사원들의 월급 합)
- MAX/MIN: 파티션별 최대/최소값
- AVG: 조건에 맞는 데이터의 평균
- COUNT: 조건에 맞는 데이터 건수
ROWS BETWEEN 구문: 현재 행 기준으로 범위를 지정합니다.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING = 앞의 1건 + 현재 행 + 뒤의 1건
기타 윈도우 함수:
- FIRST_VALUE / LAST_VALUE: 파티션에서 가장 먼저/나중에 나온 값 (SQL Server 미지원)
- LAG / LEAD: 이전/이후 몇 번째 행의 값 (SQL Server 미지원)
- RATIO_TO_REPORT: 전체 SUM 대비 행별 백분율 (0 < 결과 <= 1)
- PERCENT_RANK: 순서별 백분율, 처음=0, 마지막=1
- CUME_DIST: 누적 백분율 (0 < 결과 <= 1)
- NTILE: 전체 건수를 N등분
시험 출제 포인트: RANK, DENSE_RANK, ROW_NUMBER의 결과 차이를 묻는 문제는 거의 매번 출제됩니다. (1,2,2,4) vs (1,2,2,3) vs (1,2,3,4)를 반드시 암기하세요.
3. DCL과 절차형 SQL
초압축 암기 요약
GRANT = 권한 부여, REVOKE = 권한 취소.
ROLE = 여러 권한을 한 번에 부여하기 위한 묶음.
Oracle은 유저 기반, SQL Server는 로그인+유저 매핑 방식.
절차형 SQL: Procedure(COMMIT/ROLLBACK 사용 가능), Trigger(COMMIT/ROLLBACK 사용 불가, DB 자동 수행).
PL/SQL은 Block 구조, 통신량 감소.
초보자 이해용 상세 설명
DCL 기본:
- GRANT CREATE USER TO SCOTT; (권한 부여)
- REVOKE CREATE TABLE FROM PJS; (권한 취소)
- ROLE: 여러 권한을 묶어서 유저에게 한 번에 부여
프로시저와 트리거의 차이:
| 구분 | 프로시저 | 트리거 |
|---|---|---|
| 실행 방식 | 사용자가 직접 호출 | DML 수행 시 DB가 자동 실행 |
| COMMIT/ROLLBACK | 사용 가능 | 사용 불가 |
PL/SQL 구조: DECLARE(선언부) -> BEGIN~END(실행부) -> EXCEPTION(예외처리부)
시험 출제 포인트: 프로시저와 트리거의 COMMIT/ROLLBACK 사용 가능 여부 차이가 핵심 출제 포인트입니다.
4. 옵티마이저와 인덱스
초압축 암기 요약
규칙기반 옵티마이저: 우선순위 규칙에 따라 실행계획 생성.
비용기반 옵티마이저: 비용이 가장 적은 실행계획 선택, 현재 대부분 사용, 통계정보 활용.
인덱스 유일 스캔: 단 하나의 데이터, 모두 ‘=’조건.
인덱스 범위 스캔: 한 건 이상.
전체 테이블 스캔: 조건 없거나, 인덱스 없거나, 옵티마이저 판단.
초보자 이해용 상세 설명
옵티마이저: SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행합니다.
| 구분 | 규칙기반 | 비용기반 |
|---|---|---|
| 판단 기준 | 우선순위 규칙 | 예상 비용(시간/자원) |
| 참고 정보 | 인덱스 유무, SQL 참조 객체 | 통계정보, 시스템 정보 |
| 현재 사용 | 거의 사용하지 않음 | 대부분의 DB에서 사용 |
인덱스 스캔 유형:
- 인덱스 유일 스캔: 유일 인덱스로 단 하나의 데이터를 추출. 구성 칼럼 모두 ‘=’ 조건일 때만 가능
- 인덱스 범위 스캔: 한 건 이상의 데이터를 추출하는 일반적인 방식
- 인덱스 역순 범위 스캔: 리프 블록의 양방향 링크를 이용한 내림차순 읽기
전체 테이블 스캔을 하는 경우: SQL에 조건이 없는 경우, 사용 가능한 인덱스가 없는 경우, 옵티마이저 판단, 병렬처리 방식 등입니다.
JOIN 기법:
| JOIN 기법 | 방식 | 특징 |
|---|---|---|
| NL Join | 중첩 반복문 방식 | 랜덤 액세스 |
| Sort Merge Join | 정렬 후 조인 | 스캔 방식 읽기 |
| Hash Join | 해싱 기법 | CPU 위주, NL의 랜덤 액세스와 SMJ의 정렬 부담 해결 |
시험 출제 포인트: 규칙기반과 비용기반 옵티마이저의 차이, 인덱스 유일 스캔의 조건(‘=’ 조건), NL/Sort Merge/Hash Join의 특징 구분이 출제됩니다.
시험 핵심 포인트 정리
- RANK(1,2,2,4) / DENSE_RANK(1,2,2,3) / ROW_NUMBER(1,2,3,4)
- ROLLUP = N+1 Level Subtotal, 인수 순서 중요
- CUBE = 모든 조합 다차원 집계, ROLLUP보다 부하 큼
- 프로시저 = COMMIT/ROLLBACK 가능 / 트리거 = 불가
- 비용기반 옵티마이저 = 현재 대부분 사용, 통계정보 활용
- 인덱스 유일 스캔 = 모든 구성 칼럼이 ‘=’ 조건일 때만
- Hash Join = NL의 랜덤 액세스 + SMJ의 정렬 부담 해결
기본 확인문제
문제 1. 동일한 값에 대해 동일한 순위를 부여하되, 다음 순위가 연속되는 함수는?
① RANK ② DENSE_RANK ③ ROW_NUMBER ④ NTILE
문제 2. ROLLUP에서 Grouping Columns의 수가 3이면 생성되는 Subtotal Level은?
① 2 ② 3 ③ 4 ④ 6
문제 3. 트리거에 대한 설명으로 올바른 것은?
① 사용자가 직접 호출한다
② BEGIN~END에서 COMMIT 사용 가능
③ DML 수행 시 자동으로 동작한다
④ DDL에 의해서만 실행된다
문제 4. 현재 대부분의 DB에서 사용하는 옵티마이저는?
① 규칙기반 옵티마이저 ② 비용기반 옵티마이저 ③ 시간기반 옵티마이저 ④ 인덱스기반 옵티마이저
문제 5. 인덱스 유일 스캔이 가능한 조건은?
① BETWEEN 조건 사용 시
② LIKE 조건 사용 시
③ 구성 칼럼 모두 ‘=’ 조건일 때
④ IS NULL 조건 사용 시
기본문제 해설
1. 정답: ② – DENSE_RANK는 동일한 값에 동일 순위를 부여하고 다음 순위가 연속됩니다(1,2,2,3). RANK는 다음 순위를 건너뜁니다(1,2,2,4).
2. 정답: ③ – ROLLUP은 N+1 Level의 Subtotal을 생성합니다. 3+1 = 4 Level입니다.
3. 정답: ③ – 트리거는 특정 테이블에 INSERT, UPDATE, DELETE 같은 DML이 수행되었을 때 DB에서 자동으로 동작합니다. 사용자 호출이 아닙니다.
4. 정답: ② – 비용기반 옵티마이저는 SQL 처리에 필요한 비용이 가장 적은 실행계획을 선택하며, 현재 대부분의 DB에서 사용합니다.
5. 정답: ③ – 인덱스 유일 스캔은 유일 인덱스를 사용하여 단 하나의 데이터를 추출하며, 구성 칼럼 모두 ‘=’ 조건이 주어진 경우에만 가능합니다.
고난도 확인문제
문제 1. 다음 윈도우 함수 구문의 의미로 올바른 것은?
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
① 현재 행만 포함
② 현재 행 기준 앞 1건 + 현재 행 + 뒤 1건
③ 파티션 전체
④ 앞 1건만 포함
문제 2. Hash Join이 등장한 배경으로 올바른 것은?
① 인덱스 스캔의 정렬 부담 해결
② NL Join의 랜덤 액세스 문제와 Sort Merge Join의 정렬 부담 해결
③ 전체 테이블 스캔의 I/O 문제 해결
④ CROSS JOIN의 성능 문제 해결
문제 3. RATIO_TO_REPORT 함수의 결과 값 범위로 올바른 것은?
① 0 이상 1 이하 ② 0보다 크고 1보다 작거나 같다 ③ -1 이상 1 이하 ④ 0 이상 100 이하
고난도 해설
1. 정답: ②
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING은 현재 행을 기준으로 파티션 내에서 앞의 1건, 현재 행, 뒤의 1건을 범위로 지정합니다. 따라서 총 3개의 행이 윈도우 범위에 포함됩니다. 이 범위 안에서 SUM, AVG 등의 집계를 수행할 수 있습니다.
2. 정답: ②
Hash Join은 CPU 작업 위주로 처리하며, 해싱 기법을 이용합니다. NL Join의 랜덤 액세스 문제와 Sort Merge Join의 정렬 작업 부담을 해결하기 위한 대안으로 등장했습니다. 대량 데이터 처리에 효과적입니다.
3. 정답: ②
RATIO_TO_REPORT는 파티션 내 전체 SUM값에 대한 행별 칼럼 값의 백분율을 소수점으로 구합니다. 결과 값은 0보다 크고 1보다 작거나 같습니다(0 < 결과 <= 1). 비슷한 함수인 CUME_DIST도 동일한 범위를 가집니다.
SQLD 시리즈를 마치며
6편에 걸친 SQLD 핵심 요약 시리즈를 완료했습니다. 이 시리즈에서 다룬 내용을 정리하면 다음과 같습니다.
- 1편: 데이터 모델링의 이해 (엔터티, 속성, 관계, 식별자)
- 2편: 데이터 모델과 성능 (정규화, 반정규화, 파티셔닝, 분산DB)
- 3편: SQL 기본 – DDL, DML, TCL
- 4편: SQL 함수, 집계, ORDER BY
- 5편: JOIN, 집합연산자, 서브쿼리
- 6편: 윈도우 함수, 옵티마이저, 인덱스
시험 준비의 핵심은 반복 학습입니다. 각 편의 핵심 포인트와 문제를 반복적으로 풀어보면 SQLD 합격에 한 걸음 더 가까워질 것입니다. 합격을 응원합니다!
