본문으로 건너뛰기
SQL 기초집LESSON 17

CTE(WITH)로 쿼리 읽기 좋게 만들기

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

17강. CTE(WITH)로 쿼리 읽기 좋게 만들기

1. 이번 강의에서 해결할 문제

중첩 서브쿼리가 길어지면 중간 결과의 의미와 오류 위치를 찾기 어렵습니다. WITH로 계산 단계를 이름 붙여 최종 쿼리를 구성합니다.

2. 학습 목표

3. 핵심 개념

CTE는 한 SQL 문장 안에서 사용할 이름 있는 임시 결과입니다. 영구 테이블을 만들지 않으며 쿼리의 논리적 단계를 설명합니다. 엔진은 상황에 따라 펼치거나 materialize할 수 있으므로 성능 보장 수단이 아니라 가독성 도구로 먼저 이해합니다.

4. 단계별 SQL 예시

대상 테이블: players, match_results (읽기 전용)
파일 경로: C:\dev\game-ranking-db\sql\17-cte.sql

sql/17-cte.sql
WITH player_totals AS (
SELECT
player_id,
COUNT(*) AS battle_count,
SUM(CASE WHEN result = 'win' THEN 1 ELSE 0 END) AS win_count,
AVG(score) AS average_score
FROM match_results
GROUP BY player_id
),
ranked_players AS (
SELECT
player_id,
battle_count,
win_count,
average_score,
1.0 * win_count / battle_count AS win_rate
FROM player_totals
WHERE battle_count > 0
)
SELECT
p.username,
rp.battle_count,
rp.win_count,
ROUND(rp.win_rate * 100, 1) AS win_rate_percent,
ROUND(rp.average_score, 1) AS average_score
FROM ranked_players AS rp
JOIN players AS p ON p.player_id = rp.player_id
ORDER BY rp.win_rate DESC, rp.average_score DESC, p.player_id;
PowerShell · 실행 순서
sqlite3 -header -box .\data\game_ranking.db ".read .\sql\17-cte.sql"

5. 쿼리가 동작하는 이유

첫 CTE가 원시 결과를 플레이어 한 행으로 집계하고 두 번째가 승률을 계산합니다. 최종 SELECT는 표시 이름과 퍼센트 형식을 붙입니다. 1.0 *가 실수 나눗셈을 명확히 합니다.

6. 자주 하는 실수와 안전한 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

CTE(WITH)로 쿼리 읽기 좋게 만들기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“CTE(WITH)로 쿼리 읽기 좋게 만들기”에서 오류나 데이터 손실을 줄이는 선택은 무엇인가요?
  2. 문제 2“CTE(WITH)로 쿼리 읽기 좋게 만들기”에서 ‘CTE를 영구 VIEW로 생각’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

17강. CTE(WITH)로 쿼리 읽기 좋게 만들기 미완료 상태