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

VIEW로 반복 쿼리 재사용

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

19강. VIEW로 반복 쿼리 재사용

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

여러 화면이 승률 계산을 복사하면 필터나 반올림 규칙이 서로 달라집니다. 검증한 SELECT에 이름을 붙여 공통 조회 인터페이스로 사용합니다.

2. 학습 목표

3. 핵심 개념

일반 VIEW는 쿼리 정의를 저장하며 결과 행을 별도로 저장하지 않습니다. 조회할 때 기반 테이블에서 계산합니다. 권한 경계로 활용할 수 있지만 SQLite에는 PostgreSQL과 같은 세밀한 사용자 권한 모델이 없습니다.

4. 단계별 SQL 예시

대상: 신규 VIEW player_ranking; 기반 테이블 players, match_results
파일 경로: C:\dev\game-ranking-db\sql\19-view.sql

sql/19-view.sql
CREATE VIEW IF NOT EXISTS player_ranking AS
SELECT
p.player_id,
p.username,
COUNT(mr.result_id) AS battle_count,
COALESCE(SUM(CASE WHEN mr.result = 'win' THEN 1 ELSE 0 END), 0) AS win_count,
COALESCE(ROUND(AVG(mr.score), 1), 0) AS average_score,
CASE
WHEN COUNT(mr.result_id) = 0 THEN 0
ELSE ROUND(
1.0 * SUM(CASE WHEN mr.result = 'win' THEN 1 ELSE 0 END)
/ COUNT(mr.result_id),
4
)
END AS win_rate
FROM players AS p
LEFT JOIN match_results AS mr ON mr.player_id = p.player_id
GROUP BY p.player_id, p.username;

SELECT *
FROM player_ranking
ORDER BY win_rate DESC, average_score DESC, player_id
LIMIT 10;
PowerShell · 실행 순서
sqlite3 -header -box .\data\game_ranking.db ".read .\sql\19-view.sql"
sqlite3 .\data\game_ranking.db ".schema player_ranking"

5. 쿼리가 동작하는 이유

VIEW 이름을 테이블처럼 FROM에 사용할 수 있지만 내부 SELECT가 매번 평가됩니다. LEFT JOIN으로 미참여자도 포함하고 0으로 나누는 경우를 CASE로 막습니다.

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

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

VIEW로 반복 쿼리 재사용 미니 퀴즈

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

0 / 2
  1. 문제 1“VIEW로 반복 쿼리 재사용” 실습 결과를 해석하는 올바른 기준은 무엇인가요?
  2. 문제 2‘VIEW가 결과를 캐시한다고 생각’ 상태에 관한 “VIEW로 반복 쿼리 재사용” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

19강. VIEW로 반복 쿼리 재사용 미완료 상태