🚀 이 주제를 선택한 이유 & 학습 목표
- 선택 배경: 코딩 테스트에서 SQL 여러 문제를 풀면서
GROUP BY,AVG,SUM,COUNT(DISTINCT)등을 사용하여 흩어진 데이터를 요약하고 특정 조건에 따라 필터링하는 능력의 중요성을 깨달았습니다. - 학습 목표:
GROUP BY의 동작 원리를 명확히 이해하고, 집계 함수(AVG,SUM,COUNT등)를 올바르게 사용할 수 있게 됩니다.WHERE와HAVING의 차이점을 설명하고, 서브쿼리를 이용해 집계 결과를 필터링 조건으로 활용하는 방법을 마스터합니다.
📚 핵심 개념 및 원리
SQL을 이용한 데이터 분석의 핵심은 '그룹화'와 '집계'입니다. 원본 데이터(Raw Data)를 특정 기준에 따라 그룹으로 묶고, 각 그룹에 대한 통계적 요약(평균, 합계, 개수 등)을 계산하여 인사이트를 도출합니다.
1. 주요 용어 정의
GROUP BY: 지정된 컬럼(들)의 값이 같은 행들을 하나의 그룹으로 묶는 절.GROUP BY를 사용하면 뒤따르는 집계 함수들이 전체 데이터가 아닌 각 그룹에 대해 개별적으로 적용된다.- 집계 함수 (Aggregate Function): 여러 행의 값을 입력받아 단일 값으로 반환하는 함수.
AVG()(평균),SUM()(합계),COUNT()(개수),MAX()(최댓값),MIN()(최솟값) 등이 있다. DISTINCT: 중복된 값을 제거하는 키워드.COUNT(DISTINCT column)과 같이 사용하면 특정 컬럼의 고유한 값의 개수를 셀 수 있다.WHERE: 데이터를 그룹화하기 전에, 개별 행(row) 수준에서 필터링하는 조건절.HAVING: 데이터를 그룹화하고 집계 함수가 계산된 후에, 그룹 자체를 필터링하는 조건절.
2. 핵심 원리/동작 방식
SQL 쿼리 논리적 실행 순서:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- (
FROM) 테이블에서 데이터를 가져온다. - (
WHERE)WHERE조건에 맞는 개별 행들만 남긴다. - (
GROUP BY)GROUP BY기준에 따라 행들을 그룹으로 묶는다. - (
HAVING)HAVING조건(주로 집계 함수 사용)에 맞는 그룹들만 남긴다. - (
SELECT)SELECT절에 명시된 컬럼과 집계 함수를 계산한다. - (
ORDER BY) 최종 결과를 정렬한다.
예시: 평균 팁이 3달러 이상인 요일 찾기
-- day로 그룹을 묶고, 그룹별 평균 팁을 계산한 뒤, 그 결과가 3 이상인 그룹만 필터링
SELECT
day,
AVG(tip) as avg_tip
FROM
tips
GROUP BY
day
HAVING
AVG(tip) >= 3;
💡 장점, 단점 및 고려사항 (또는 기술/개념 비교)
- 유사 기술/개념과의 비교**:
| 특징 | WHERE |
HAVING |
|---|---|---|
| 실행 시점 | 그룹화(GROUP BY) 이전 | 그룹화(GROUP BY) 이후 |
| 필터링 대상 | 개별 행 (Row-level) | 그룹 (Group-level) |
| 집계 함수 사용 | 사용 불가 | 사용 가능 |
| 주요 목적 | 분석할 데이터의 전체 범위를 줄임 | 그룹화된 결과 중에서 의미 있는 그룹을 선별 |
| 예시 | WHERE smoker = 'Yes' (흡연자인 행만 필터링) |
HAVING COUNT(*) > 10 (주문 건수가 10건 이상인 그룹만 필터링) |
🤔 나의 이해와 생각 정리 (회고)
- 핵심 요약:
GROUP BY는 데이터를 묶는 도구, 집계 함수는 묶인 그룹을 요약하는 도구,HAVING은 요약된 결과를 필터링하는 도구다. 이 세 가지의 관계와 실행 순서를 이해하는 것이 복잡한 SQL 문제 해결의 열쇠이다. - 새롭게 깨달은 점:
COUNT(*)는 단순히 행의 개수를 세는 반면,COUNT(DISTINCT order_id)는 '주문 건수'처럼 비즈니스 로직에 맞는 고유한 값을 세는 데 사용된다는 차이점을 명확히 알게 되었다.- 전체 데이터의 평균과 개별 행을 비교해야 할 때는
WHERE절에 서브쿼리를 사용하여(SELECT AVG(total_bill) FROM tips)와 같이 미리 계산된 값을 조건으로 활용할 수 있다는 것을 배웠다.
- 더 궁금해진 점 / 의문점: 서브쿼리 대신 '윈도우 함수(Window Functions)'를 사용하면 더 효율적으로 순위, 비율, 누적 합계 등을 계산할 수 있다고 들었다.
RANK(),DENSE_RANK(),ROW_NUMBER()와 같은 윈도우 함수들의 차이점과 활용법을 더 깊이 학습하고 싶다.
✨ 마무리하며
단순히 데이터를 SELECT 하는 것을 넘어, GROUP BY와 집계 함수를 통해 데이터를 요약하고 의미를 추출하는 과정이 데이터 분석의 첫걸음임을 깨달았다. 처음에는 WHERE와 HAVING의 차이가 헷갈리고 서브쿼리가 복잡하게 느껴졌지만, 여러 문제를 반복해서 풀면서 SQL 쿼리의 논리적 실행 순서를 체득하게 되었다. 이제는 문제의 요구사항을 보고 어떤 집계 함수와 그룹화 전략을 사용해야 할지 머릿속으로 설계할 수 있게 되었다.
'Study > SQL' 카테고리의 다른 글
| [Database] SQL 서브쿼리: IN vs EXISTS (0) | 2025.09.24 |
|---|