7. 서브쿼리
1. 서브쿼리의 종류
| 구분 | 위치 | 설명 |
| SELECT절 서브쿼리 | SELECT 뒤 | 계산된 값을 컬럼처럼 반환. 결과가 반드시 1행 이하이어야 함 |
| FROM절 서브쿼리 | FROM 뒤 | 쿼리 결과를 임시 테이블처럼 사용 (AS 별칭 필수) |
| WHERE절 서브쿼리 | WHERE 뒤 | 조건절에 다른 쿼리 결과를 삽입하여 필터링 수행 |
예시
SELECT A.*, (SELECT GENDER FROM CUSTOMER B WHERE A.MEM_NO = B.MEM_NO) AS GENDER FROM SALE AS A;
→ 고객 테이블에서 성별을 불러와 판매 데이터에 추가
WHERE절 서브쿼리 예시:
SELECT *
FROM SALE
WHERE MEM_NO IN (SELECT MEM_NO FROM CUSTOMER WHERE JOIN_DATE = '2024-01-22');
2. WITH문 (공통 테이블 표현식, CTE)
WITH문은 서브쿼리의 가독성과 재사용성을 높인 형태로, 임시 테이블처럼 여러 쿼리에서 반복적으로 사용할 수 있는 구조이다
.예시
WITH A AS ( SELECT MEM_NO, COUNT(ORDER_NO) AS TOT_TR FROM SALE GROUP BY MEM_NO ) SELECT * FROM A;
- FROM절 서브쿼리보다 구조가 깔끔하고 유지보수 용이
- 여러 개의 CTE를 쉼표로 연결하여 계층적 쿼리 작성 가능
3. WITH문을 활용한 데이터 마트 생성
실무에서는 여러 테이블을 조합해 분석용 데이터 마트(Data Mart) 를 만드는 경우가 많다.
이번 강의에서는 CUSTOMER_MART 와 SALE_MART 두 가지 예시를 다뤘다
7-3. WITH문을 활용한 데이터 마트 생성
.
CUSTOMER_MART 생성 예시
- 기준 테이블: CUSTOMER
- JOIN 대상: SALE
- 생성 정보:
- 회원별 구매주기(CIRCLE)
- 재구매 여부(RETENTION_YN)
- 2024년 구매 여부(PURCHASE_2024_YN)
WITH BASE AS (
SELECT A.MEM_NO, GENDER,
MIN(ORDER_DATE) AS MIN_ORDER_DATE,
MAX(ORDER_DATE) AS MAX_ORDER_DATE,
COUNT(DISTINCT ORDER_NO) AS COUNT_ORDER
FROM CUSTOMER A
INNER JOIN SALE B ON A.MEM_NO = B.MEM_NO
WHERE YEAR(ORDER_DATE) IN ('2024','2025')
GROUP BY A.MEM_NO, GENDER
),
CIRCLE AS (
SELECT *, DATEDIFF(MAX_ORDER_DATE, MIN_ORDER_DATE)/(COUNT_ORDER-1) AS CIRCLE
FROM BASE WHERE COUNT_ORDER > 1
)
SELECT A.*, CIRCLE FROM BASE A LEFT JOIN CIRCLE USING(MEM_NO);
SALE_MART 생성 예시
- 기준 테이블: SALE
- JOIN 대상: SALE_DETAIL, SERVICE, HOTEL
- 추가 컬럼: ORDER_DETAIL_NO, QTY, SERVICE_NAME, SALES_AMT, ORDER_DATE_YM
4. 서브쿼리 코딩 테스트
다양한 서브쿼리 및 WITH문을 실무 시나리오로 적용해보는 문제를 수행했다
| ① | 호텔명이 ‘seoul’을 포함하는 서비스만 대상으로 평균·최대 가격 조회 |
| ② | FROM절 서브쿼리를 이용해 SALE + SALE_DETAIL + SERVICE 결합 테이블 생성 |
| ③ | ②번을 WITH문으로 변환하여 동일 결과 조회 |
| ④ | SALES_AMT 합계 구간별 회원수(SEGMENT) 집계 (2천만↑ / 1천만↑ / 1천만↓) |
| ⑤ | 2025-01-01 기준으로 최근 구매일(DAY_DIFF) 계산 |
| ⑥ | DAY_DIFF 구간별 회원수 분류 (100일, 200일, 300일 이상 구간) |
* 이 글은 제로베이스 데이터사이언스 파트타임 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.
💡 생각 정리
이번 강의는 SQL을 단순히 “데이터를 조회하는 언어”에서 “데이터 구조를 설계하는 언어”로 확장시켜 준 내용이었다.
특히 서브쿼리와 WITH문은 복잡한 로직을 한 줄씩 쌓아올리듯 설계할 수 있게 해주어, SQL을 ‘읽기 쉬운 코드’로 만드는 도구라는 점이 가장 인상 깊었다.
FROM절 서브쿼리로 임시 데이터를 만들고, 이를 WITH문으로 구조화하면서, SQL이 프로그래밍 언어처럼 재사용성과 구조화를 지원한다는 것을 체감했다.
또한 데이터 마트를 직접 설계하며, 실제 분석에 필요한 핵심 지표(재구매율, 평균 구매주기, 매출 구간별 회원 수) 를 SQL만으로 계산할 수 있었다는 점에서, SQL이 단순한 질의 언어가 아니라 데이터 분석의 엔진임을 다시 한번 느꼈다.
🚀 적용점
- SELECT, FROM, WHERE절 서브쿼리를 각각 직접 작성하고 실행 결과를 비교한다.
- FROM절 서브쿼리 → WITH문으로 변환하며 쿼리 가독성 변화를 체험한다.
- CUSTOMER_MART, SALE_MART 예제를 참고하여 자신만의 데이터 마트를 생성해본다.
- 구매주기(CIRCLE), 재구매율(RETENTION) 등 핵심 지표를 SQL로 계산해본다.
- 구간별 집계(SEGMENT) 문제를 통해 CASE WHEN 활용법을 반복 연습한다.
👉 이번 강의는 실무형 SQL 사고력을 기르는 핵심 단계였다.
서브쿼리와 WITH문을 자유자재로 다룰 수 있다면, 대규모 데이터를 한 번에 가공하고 분석하는 능력을 갖추게 된다.
'데이터' 카테고리의 다른 글
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-9 (0) | 2025.10.08 |
|---|---|
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-8 (0) | 2025.10.07 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-6 (0) | 2025.10.05 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-5 (0) | 2025.10.04 |
| 제로베이스 데이터사이언스 스쿨 - Part.02 데이터 분석을 위한 SQL-4 (0) | 2025.10.04 |