데이터베이스 연구실.log

WITH 절

쿼리 앞에 이름 붙인 서브쿼리를 정의하고 본문에서 테이블처럼 쓰는 WITH 절의 기본 형태

WITH서브쿼리 팩터링CTE인라인 뷰

#핵심 요약

WITH 이름 AS (서브쿼리) SELECT ... FROM 이름으로, 서브쿼리에 이름을 붙여 본문에서 테이블처럼 씀

인라인 뷰로 쓰던 순위 쿼리를 앞으로 빼서 읽기 쉽게 만들 수 있음

#개념과 동작 원리

WITH의 이름은 본문과 뒤에 정의한 서브쿼리에서 재사용할 수 있음
인라인 뷰 또는 임시 테이블로 최적화될 수 있어 실행 횟수는 계획에 따라 달라짐

#주요 용어와 구성 요소

재귀 WITH는 시작 집합인 anchor와 자신의 이름을 참조하는 recursive 부분을 UNION ALL로 연결하고 열 별칭을 명시하는 구조임

#필수 명령어 또는 SQL

항목 실행 조건
작업 대상 emp의 월급 순위와 sal_rank 쿼리 블록
필요 권한 emp 조회 권한이 있는 계정
바꿀 입력값 쿼리 이름, 조회 열, 순위 필터, 정렬 기준
결과 해석 현재 사원별 순위 조회 출력은 기재 없음
SQL Developer 또는 SQL*Plus조회만 함
WITH sal_rank AS
(
  SELECT deptno, ename, sal,
         RANK() OVER (ORDER BY sal DESC) 순위
    FROM emp
)
SELECT *
  FROM sal_rank
 WHERE 순위 IN (2, 10);

결과 해석: 월급 순위가 2위와 10위인 사원임
분석 함수 결과는 같은 쿼리의 WHERE에서 바로 거를 수 없으므로 WITH 절(또는 인라인 뷰)로 한 번 감싼 뒤 거름(순위와 구간 분석)

같은 내용을 인라인 뷰로 쓰면 다음과 같음

SQL Developer 또는 SQL*Plus조회만 함
SELECT *
  FROM (SELECT deptno, ename, sal,
               RANK() OVER (ORDER BY sal DESC) 순위
          FROM emp)
 WHERE 순위 IN (2, 10);

결과 해석:

실습 복습 문제: 직업별 월급 합계에서 SALESMAN 제외, 합계 4000 이상, 합계 내림차순
이름, 월급, 입사 연도, 입사일을 입사 연도 순, 같은 연도 안에서 입사일 순으로 출력
집계 조건은 집계 함수와 그룹별 조회, 정렬 조건은 정렬과 중복 제거 참조

#구문과 옵션 설명

본문의 sal_rank는 저장된 뷰가 아니라 해당 SQL 안의 쿼리 이름임
여러 이름을 정의할 때는 의존하는 이름을 앞에 두는 방식임

#사용 조건과 주의사항

WITH 사용 전후 성능은 실행계획과 실행 통계로 비교함
본문의 RANK 결과는 동순위가 있으면 여러 행이 남을 수 있음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기