🎯 오늘 수업 목표

수강생이 세션 종료 후 할 수 있어야 하는 것:

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

+ Recent posts