🎯 오늘 수업 목표
수강생이 세션 종료 후 할 수 있어야 하는 것:
1. CASE로 “조건에 따라 값 바꾸기/라벨 붙이기”를 할 수 있다.
2, 서브쿼리가 어떤 형태(값 1개 / 리스트 / 표)로 결과를 만드는지 이해한다.
3. IN(리스트 필터)과 EXISTS(존재 여부 필터)의 차이를 말로 설명하고 쓸 수 있다. (특히 NOT EXISTS)
4. FROM에 (SELECT ...)를 넣는 Derived table(파생 테이블)을 만들고, 별칭(alias)이 필수라는 걸 안다.
5. CTE(WITH)가 “이름 붙인 임시 결과”이며 한 문장(statement) 안에서만 살아있다는 걸 이해한다
6. CTE + CASE를 합쳐서 “아주 간단한 리포트”를 만들 수 있다.
1. CASE
SQL에서 조건에 따라 다른 값을 반환하는 조건 함수
특징
- 위에서부터 순서대로 WHEN 검사
- 처음 TRUE인 WHEN에서 바로 종료
- ELSE 없고 모든 WHEN이 FALSE면 → NULL
2. CASE + 집계 : 조건부 집계
2_1) 조건부 SUM: “조건을 만족한 대상의 총합”을 구할 때 사용
“조건을 만족한 대상의 총합”을 구할 때 사용
COUNT와 달리 ELSE 0이 매우 중요 (NULL이면 합산 누락)
2_2) 조건부 COUNT: “조건을 만족한 행의 개수”를 세고 싶을 때 사용
“조건을 만족한 행의 개수”를 세고 싶을 때 사용
TRUE / FALSE를 직접 세는 게 아니라 NULL 여부를 이용해 필터링
2_3) 조건부 SUM vs 조건부 COUNT 차이 정리
| 조건부 SUM | 조건부 COUNT |
| 얼마인가? (규모, 금액, 수치) | 몇 건인가? (개수) |
| 조건 불만족 시 0으로 누적 차단 | NULL 여부를 이용한 필터링 |
2. Subquery (서브쿼리)
1. 서브쿼리란?
서브쿼리는 다른 SQL 문 안에 포함된 SELECT 쿼리 → 바깥 쿼리를 실행하기 위해 중간 결과를 제공하는 역할
특징
- 항상 SELECT로 시작
- 괄호 ()로 감싸서 사용
- 바깥 쿼리보다 먼저 실행되는 경우가 많음
- 결과는 바깥 쿼리의 → 조건 / 비교 대상 / 값으로 사용됨
Scalar Subquery (스칼라 서브쿼리): 결과가 반드시 “단 하나의 값(1행 1열)”인 서브쿼리
List Subquery(리스트 서브쿼리): 결과가 여러 행(1열 이상) 나오는 서브쿼리
⭐ 분류에 대한 메모
Scalar / List 구분은 이론적 분류는 큰 의미는 없다.
다만 “결과가 하나냐 / 여러 개냐”만 중요
2) EXISTS / NOT EXISTS (“없다/있다” 찾기 최고)
“있다 / 없다”를 판단하는 존재 여부 전용 서브쿼리
동작 방식
- 조건을 만족하는 행을 하나라도 찾으면 즉시 TRUE
- 찾지 못하면 FALSE
- 실제 값 반환 X
3) 상관 서브쿼리(Correlated Subquery) 가볍게 이해
서브쿼리가 바깥 쿼리의 값을 참조하는 형태
일반 서브쿼리와 차이
- 단독 실행 X
- 바깥 쿼리 없이는 의미 없음
언제 쓰나?
- “각 행 기준으로 조건을 따로 판단해야 할 때”
- 그룹 없이도→ 행별 비교 / 행별 존재 여부 확인 가능
Part 3. FROM 서브쿼리(파생 테이블)
“괄호 속 SELECT를 표로 만들기”
1, 왜 FROM 서브쿼리를 쓰는가?
4회차에서 힘들었던 포인트:
- 1 : N 관계에서 N쪽 테이블을 그대로 JOIN하면 행 수가 폭증
- 그 상태로 SUM / COUNT 하면 값이 부풀려짐
해결법
- N쪽 테이블을 먼저 GROUP BY로 요약
- 행 수를 줄인 ‘중간 결과 테이블’로 만든 뒤
→ 그 결과를 JOIN
2. 파생 테이블(Derived Table)이란?
FROM 절에 들어간 서브쿼리의 결과를 “임시 테이블처럼” 사용하는 것
특징
- 괄호 () 안의 SELECT 결과가
- 실행 중에 가상의 테이블이 됨
- SELECT / JOIN / WHERE에서
→ 일반 테이블과 동일하게 취급
서브쿼리 위치별 역할 차이
WHERE 서브쿼리 → 필터링
SELECT 서브쿼리 → 값 생성
FROM 서브쿼리 → 구조(표) 생성
⭐파생 테이블에서 가장 중요한 규칙
별칭(Alias) 필수
별칭 없으면 → 문법 에러 발생
Part 4. CTE (WITH)
“이름 붙인 파생테이블”
1. CTE란?
CTE(Common Table Expression)는 이름이 붙은 임시 결과 집합
핵심
-단일 SQL statement 범위에서만 존재
- 실행이 끝나면 자동 소멸
-하나의 쿼리 안에서 여러 번 참조 가능
2. CTE의 본질 (FROM 서브쿼리와의 관계)
CTE = 가독성 좋은 FROM 서브쿼리
기능적으로는 거의 동일 → 차이는 구조와 가독성
사용이유?
- 쿼리가 길어질수록 중첩 FROM 서브쿼리는 읽기 어려움
- CTE는 단계별로 이름을 붙여 로직을 위에서 아래로 읽을 수 있음
3) CTE 기본 문법 (가장 쉬운 형태)
구조
WITH 절에서...
- CTE 이름 정의
- 그 안에 SELECT 작성
아래 메인 쿼리에서...
- 테이블처럼 사용
자세한 내용은 복습 참조
'A.Today I Learne > SQL' 카테고리의 다른 글
| [TIL] SQL 라이브세션 6회차 (0) | 2025.12.31 |
|---|---|
| 데이터 딕셔너리에 관하여 (0) | 2025.12.29 |
| [TIL] SQL 라이브세션 4회차 (1) | 2025.12.29 |
| 포메팅 습관 (0) | 2025.12.28 |
