WITH 절
쿼리 앞에 이름 붙인 서브쿼리를 정의하고 본문에서 테이블처럼 쓰는 WITH 절의 기본 형태
#핵심 요약
WITH 이름 AS (서브쿼리) SELECT ... FROM 이름으로, 서브쿼리에 이름을 붙여 본문에서 테이블처럼 씀
인라인 뷰로 쓰던 순위 쿼리를 앞으로 빼서 읽기 쉽게 만들 수 있음
#개념과 동작 원리
WITH의 이름은 본문과 뒤에 정의한 서브쿼리에서 재사용할 수 있음
인라인 뷰 또는 임시 테이블로 최적화될 수 있어 실행 횟수는 계획에 따라 달라짐
#주요 용어와 구성 요소
재귀 WITH는 시작 집합인 anchor와 자신의 이름을 참조하는 recursive 부분을 UNION ALL로 연결하고 열 별칭을 명시하는 구조임
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | emp의 월급 순위와 sal_rank 쿼리 블록 |
| 필요 권한 | emp 조회 권한이 있는 계정 |
| 바꿀 입력값 | 쿼리 이름, 조회 열, 순위 필터, 정렬 기준 |
| 결과 해석 | 현재 사원별 순위 조회 출력은 기재 없음 |
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 절(또는 인라인 뷰)로 한 번 감싼 뒤 거름(순위와 구간 분석)
같은 내용을 인라인 뷰로 쓰면 다음과 같음
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 결과는 동순위가 있으면 여러 행이 남을 수 있음