반응형

파이썬 문자열 마스터하기: 인덱싱, 슬라이싱, 포맷팅, 함수 총정리

여러분, 문자열 처리만 제대로 익혀도 파이썬 실력이 한 단계 확 올라간다는 사실, 알고 계셨나요?

 

 

안녕하세요!

오늘은 파이썬 초보자라면 꼭 알아야 할 문자열 다루기에 대해 다뤄보려 해요.

파이썬에서 문자열은 단순한 텍스트 데이터가 아닙니다.

문자열 인덱싱과 슬라이싱, 포맷팅, 함수들을 잘 활용하면 데이터 처리, 출력 형식 지정, 텍스트 조작 등 다양한 작업을 아주 효율적으로 처리할 수 있거든요.

이 글에서는 헷갈리기 쉬운 인덱스와 슬라이스 개념부터, 초보자들이 자주 틀리는 포맷팅 방식, 그리고 실무에서 자주 쓰이는 문자열 함수들까지 전부 친절하게 알려드릴게요.

1. 문자열 인덱싱의 원리와 활용법 🔍

문자열 인덱싱(Indexing)은 문자열 안의 특정 문자를 위치를 기준으로 가져오는 방식이에요.

마치 책갈피처럼, 문자열의 글자마다 고유한 번호(index)가 매겨지기 때문에, 우리가 원하는 문자를 숫자로 불러오는 거죠!

문자열 인덱싱의 기본 개념

파이썬에서 문자열은 0부터 시작하는 인덱스를 가지고 있어요.

왼쪽에서부터는 0, 1, 2... 순서대로, 오른쪽에서부터는 -1, -2, -3... 이렇게 부여되죠.

text = "Python"
print(text[0])   # P
print(text[-1])  # n

text[0]는 문자열의 첫 글자인 'P'를, text[-1]은 마지막 글자인 'n'을 반환해요.

이처럼 앞에서든 뒤에서든 원하는 글자 하나만 뽑아낼 수 있어요.

문자 인덱싱 실습 예제

문자열 인덱스 결과
"Hello, World!" [7] W
"Python" [-2] o

인덱싱에서 주의할 점

  • 인덱스 범위를 벗어나면 IndexError가 발생해요.
  • 음수 인덱스를 사용할 때는 문자열 길이와 비교해서 신중히 접근하세요.

문자열 인덱싱은 파이썬의 핵심 개념 중 하나로, 나중에 리스트, 튜플, 문자열 파싱 작업에서도 자주 사용되니까 지금 확실히 익혀두면 정말 좋아요!

 

 

2. 문자열 슬라이싱으로 원하는 부분 추출 ✂️

문자열에서 특정 구간을 잘라내고 싶을 때는 슬라이싱(Slicing)을 사용해요.

슬라이싱은 문자열[시작:끝] 형태로 사용하며,

시작 인덱스는 포함되고 끝 인덱스는 제외된다는 점! 꼭 기억해두세요.

text = "Hello, Python!"
print(text[0:5])   # Hello
print(text[7:13])  # Python

슬라이싱의 다양한 형태

슬라이싱 구문 설명
text[:5] 처음부터 5번째 문자 전까지 (0~4)
text[7:] 7번째 문자부터 끝까지
text[:-1] 마지막 문자 제외하고 전부
text[::2] 전체 문자열에서 한 칸씩 건너뛰며 출력

실제 예제로 감 잡기

msg = "파이썬 문자열 슬라이싱 연습"
print(msg[:3])     # 파이썬
print(msg[-3:])    # 연습
print(msg[4:8])    # 문자열

슬라이싱은 단순히 문자열을 잘라내는 기능을 넘어서, 특정 형식의 데이터를 추출하거나 가공하는 데 자주 사용돼요.

예를 들어

주민등록번호에서 생년월일만 뽑거나, 파일 경로에서 확장자만 잘라내는 경우에도 쓰이죠.

활용 팁 💡

  • text[::-1]을 사용하면 문자열을 뒤집을 수 있어요.
  • 슬라이싱은 리스트나 튜플에도 그대로 사용 가능하니 꼭 익혀두세요!

파이썬 슬라이싱은 간단해 보이지만, 익숙해지면 정말 다재다능한 무기가 되어줍니다.

초보자분들은 꼭 손으로 직접 입력해보며 연습해보세요!

 

 

3. 문자열 포맷팅: %, format(), f-string 비교 🧩

출력 결과를 보기 좋게 다듬고 싶다면?

바로 문자열 포맷팅이 필요해요.

포맷팅은 문자열 안에 변수를 넣거나 숫자의 형식을 지정할 때 사용되는데요,

파이썬에는 대표적으로 % 포맷 방식, format(), 그리고 f-string 방식이 있어요.

각각의 특징을 예제와 함께 비교해볼게요!

① % 포맷 방식

name = "홍길동"
age = 30
print("이름: %s, 나이: %d" % (name, age))

%s는 문자열, %d는 정수, %f는 실수를 의미해요.

예전 방식이지만 여전히 사용되고 있어요.

② format() 함수 방식

print("이름: {}, 나이: {}".format(name, age))
print("이름: {0}, 나이: {1}".format(name, age))
print("이름: {n}, 나이: {a}".format(n=name, a=age))

format()은 인덱스나 키워드 인자를 활용할 수 있어 유연하고 다양한 방식의 문자열 출력이 가능해요.

③ f-string (파이썬 3.6 이상)

print(f"이름: {name}, 나이: {age}")

f-string은 가장 간결하고 직관적인 최신 방식이에요.

변수명만 중괄호에 넣으면 바로 출력 가능해서 특히 많이 사용돼요.

 

포맷팅 비교 요약표

포맷팅 방식 장점 단점
% 간단한 출력에 유용 복잡한 포맷에는 불리함
format() 인덱스/이름 지정 등 다양한 형태 가능 코드 길이가 조금 길어질 수 있음
f-string 가장 간결하고 가독성이 좋음 파이썬 3.6 이상에서만 사용 가능

상황에 따라 포맷팅 방식이 달라질 수 있지만, 최근에는 대부분 f-string을 선호해요.

속도도 빠르고, 눈에 잘 들어오거든요 😎

 

 

4. 자주 쓰이는 문자열 함수 총정리 📚

파이썬 문자열은 단순한 텍스트 그 이상이에요.

문자열 객체가 수많은 유용한 함수들을 내장하고 있어서, 복잡한 텍스트 처리도 단 몇 줄이면 OK!

여기선 초보자부터 중급자까지 꼭 알아야 할 함수들을 분야별로 정리해볼게요.

① 문자열 검색 관련 함수

  • find(): 처음 찾은 위치 반환, 없으면 -1
  • index(): 찾는 문자열의 위치 반환, 없으면 오류 발생
  • count(): 특정 문자가 몇 번 등장하는지 세기

② 대소문자 및 공백 처리

  • upper(): 모든 문자를 대문자로
  • lower(): 모든 문자를 소문자로
  • strip(): 양쪽 공백 제거 (lstrip(), rstrip()도 있음)

③ 문자열 변형

  • replace(old, new): old를 new로 바꾸기
  • split(sep): 문자열을 리스트로 분리
  • join(): 리스트 요소를 문자열로 연결
  •  

예제: 함수 조합으로 문장 다듬기

text = "   Hello, Python!    "
result = text.strip().replace("Python", "World").upper()
print(result)  # HELLO, WORLD!

strip()으로 양쪽 공백 제거, replace()로 단어 변경, upper()로 대문자 변환!

이런 식으로 여러 함수를 체인처럼 이어쓰기가 가능해요.

실무에서도 문자열 정리는 거의 필수에요.

예를 들어

CSV 데이터 전처리, 사용자 입력 정리, HTML 텍스트 추출 등 다양한 곳에 쓰이죠.

지금 소개한 함수들만 제대로 익혀도 문자열 다루는 데 큰 무기가 될 거예요!

 

 

5. 문자열 다룰 때 꼭 알아야 할 팁과 주의사항 ⚠️

문자열은 파이썬에서 아주 자주, 아주 널리 쓰이는 데이터 타입이에요.

그런데 간단해 보이는 문자열도 조금만 실수하면 오류가 나거나 예상과 다른 결과가 나와서 당황하게 되죠.

지금부터는 문자열 다룰 때 꼭 주의해야 할 부분과 팁들을 정리해볼게요!

① 문자열은 '변경 불가능(immutable)'하다

문자열은 한 번 생성하면 값을 바꿀 수 없어요.

리스트처럼 특정 인덱스에 값을 직접 대입하려 하면 오류가 납니다.

text = "hello"
text[0] = "H"  # TypeError 발생!

대신 새로운 문자열을 만들어야 해요: text = "H" + text[1:]

② 줄바꿈 문자와 공백은 예외 없이 처리!

\n은 줄바꿈, \t은 탭.

눈에는 안 보이지만 존재하는 문자들이에요.

특히 사용자 입력 데이터에는 공백이 자주 섞여 있으니 strip() 필수!

user_input = "  yes\n"
print(user_input.strip())  # "yes"

③ 문자열 비교는 공백까지 포함해서!

"yes" == " yes " 는 False입니다!

문자열 비교 시에는 공백 제거와 대소문자 처리를 잊지 마세요.

a = "YES"
b = " yes "
print(a.lower() == b.strip().lower())  # True

④ 문자열 길이 체크는 len()으로!

입력값 유효성 검사, 조건 분기 등에 자주 쓰이는 len()은 정말 자주 쓰여요.

문자열이 비었는지도 len(s) == 0 또는 if not s:로 확인 가능해요.

문자열 다룰 때 실수 줄이는 팁 정리

상황
입력값 처리 strip(), lower() 함께 쓰기
특정 문자 포함 여부 'abc' in text로 확인
빈 문자열 검사 if not text: 또는 if text == ""

이런 사소한 실수 하나하나가 전체 코드의 신뢰도에 영향을 주기도 해요.

문자열 다루는 건 단순히 문자를 다루는 게 아니라, 데이터를 다루는 기본기라는 걸 잊지 마세요!

 

 

6. 실전 예제와 함께하는 문자열 실습 💡

문법만 안다고 해서 끝이 아니죠.

실제로 손으로 코딩해보고, 문자열을 직접 다뤄보는 실습이 정말 중요해요.

이번엔 앞에서 배운 인덱싱, 슬라이싱, 포맷팅, 문자열 함수들을 종합해서 실전 예제를 만들어볼게요.

실무에서 자주 마주치는 시나리오로 구성했으니 꼭 연습해보세요!

예제 1️⃣: 사용자 입력값 정리하기

사용자 입력값에 공백이 섞여 있다면?

불필요한 공백 제거, 대소문자 통일은 기본 중의 기본!

raw_input = "   YES\n"
cleaned = raw_input.strip().lower()
print(cleaned)  # "yes"

예제 2️⃣: 주민등록번호에서 생년월일 추출

문자열 슬라이싱을 활용해 특정 위치의 정보만 뽑아볼게요.

rrn = "901231-1234567"
birth = rrn[:6]
gender_code = rrn[7]
print(f"생년월일: {birth}, 성별코드: {gender_code}")

예제 3️⃣: 파일 확장자 추출기

문자열 메서드 중 split()join()을 활용해서 파일 확장자를 추출해보세요.

filename = "report_final_2025.pdf"
ext = filename.split('.')[-1]
print(f"파일 확장자: {ext}")  # pdf

예제 4️⃣: 문자열 뒤집기

파이썬의 슬라이싱 기능만 알면 문자열을 손쉽게 뒤집을 수 있어요!

word = "hello"
reverse = word[::-1]
print(reverse)  # "olleh"

미션 🎯

다음 문자열을 활용해서 실습해보세요!

text = "   Learn Python Programming NOW!  "
  • 앞뒤 공백 제거하기
  • "NOW!" → "NOW"로 바꾸기
  • 모두 소문자로 바꾸기

이렇게 실습 예제들을 따라 하다 보면, 문자열을 자유자재로 다루는 능력이 자연스럽게 길러질 거예요.

배운 내용을 코딩으로 반복 연습하는 게 가장 확실한 공부 방법이니까 꼭 해보세요!

 

 

마무리 ✨

지금까지 파이썬 문자열의 인덱싱, 슬라이싱, 포맷팅, 그리고 다양한 함수들을 차근차근 살펴봤습니다.

하나하나 별개로 보이지만, 실은 모두 연결된 하나의 흐름이라는 거, 느껴지셨나요?

문자열은 데이터 처리의 시작점이자 끝점이에요.

문자열을 자유롭게 다룰 수 있다는 건, 데이터를 내 마음대로 가공하고 표현할 수 있는 능력을 의미합니다.

실제 현업에서도 로그 분석, 사용자 입력 처리, CSV/JSON 파싱, API 응답 처리 등 거의 모든 영역에서 문자열을 마주하거든요.

처음에는 index, slice, format, strip, replace, split 같은 함수들이 어렵게 느껴질 수도 있어요.

하지만 여러 번 써보고, 실습해보고, 내 프로젝트에 적용해보면 어느새 익숙해질 거예요.

"함수는 외우는 게 아니라 써보는 것이다." 이 말, 꼭 기억해 주세요!

다음에는 파일 읽기, 정규표현식, 텍스트 전처리 등 더 재미있는 주제로 돌아올게요 😊

반응형
반응형

HAVING 절과 조건부 집계
: 집계함수를 한 단계 더 활용하는 방법

SQL의 GROUP BY는 알고 있지만, 그 결과에 조건을 걸 수 있는 HAVING 절은 아직 낯설게 느껴지시나요?

 

 

안녕하세요!

오늘은 SQL에서 데이터를 집계할 때 유용하게 사용할 수 있는 HAVING 절에 대해 자세히 알아보려 합니다.

많은 분들이 WHERE와 GROUP BY는 익숙하지만, 그 다음 단계인 HAVING 절의 쓰임새에 대해서는 헷갈리거나 잘 사용하지 않는 경우가 많아요.

하지만 데이터를 좀 더 정교하게 다루기 위해서는 꼭 알아야 할 부분이죠.

이번 글에서는 HAVING 절이 왜 필요한지, 그리고 어떻게 활용할 수 있는지 실습 예제를 통해 함께 알아보겠습니다.

이 글을 끝까지 읽으시면, 매출이 높은 상위 카테고리를 필터링하거나 조건에 맞는 그룹 데이터를 추출하는 방법까지 완벽하게 익히실 수 있어요.

자, 그럼 지금부터 HAVING 절의 매력에 빠져볼 준비 되셨나요? 😊

1. HAVING 절이란? 왜 필요할까

SQL에서 HAVING 절GROUP BY로 집계된 결과에 조건을 걸기 위해 사용됩니다.

일반적으로 조건을 걸 때는 WHERE 절을 많이 쓰지만, 이 절은 집계 함수(Aggregate Function)와 함께 사용할 수 없습니다.

그래서 등장한 것이 바로 HAVING입니다.

 

HAVING 절은 GROUP BY로 묶인 각 그룹에 대해 SUM, COUNT, AVG, MAX, MIN 등의 집계 함수를 기준으로 조건을 거는 데 쓰여요.

예를 들어,

전체 매출을 카테고리별로 묶은 뒤, 매출이 1,000만 원 이상인 카테고리만 보고 싶다면 HAVING 절이 꼭 필요하겠죠?

🚫 WHERE 절만으로는 안 되는 이유

  • WHERE 절은 집계 함수와 함께 사용 불가
  • HAVINGGROUP BY 이후의 결과를 필터링할 수 있음

📊 HAVING 절을 사용한 기본 예제

SELECT category, SUM(sales) AS total_sales
FROM sales_data
GROUP BY category
HAVING SUM(sales) > 10000000;

 

위 쿼리는 카테고리별 총 매출이 1,000만 원 이상인 경우만 결과로 보여줘요.

HAVING SUM(sales) > 10000000 부분이 바로 포인트입니다.

✔️ 왜 실무에서 자주 쓰일까?

  1. 조건에 맞는 매출/사용자/주문 데이터를 필터링해야 할 때
  2. 운영 보고서, 대시보드 생성 시 조건부 요약 필수
  3. 비즈니스 인사이트 도출을 위해 중요한 기준 필터링 필요

HAVING 절은 단순 통계를 넘어서 조건 기반 분석을 할 수 있도록 도와줍니다.

보고서나 BI툴에 쿼리를 연동할 때도 거의 필수처럼 등장하죠.

실무에서 데이터를 다룬다면 꼭 알아둬야 할 필수 기술이라고 할 수 있어요.

 

 

2. WHERE 절과 HAVING 절의 차이점

HAVING 절을 제대로 활용하려면, 먼저 WHERE 절과의 차이점을 확실히 이해하고 있어야 해요.

둘 다 '조건을 거는 문장'이라는 점에서 비슷해 보이지만, 작동하는 시점과 대상이 전혀 다릅니다.

🔍 WHERE vs HAVING 작동 시점 비교

항목 WHERE 절 HAVING 절
적용 시점 GROUP BY 전에 작동 GROUP BY 이후에 작동
적용 대상 개별 행(Row) 그룹(Group)
집계 함수 사용 불가능 ❌ 가능 ✅

즉, WHERE원천 데이터에 조건을 걸고, HAVING그룹핑된 결과에 조건을 거는 거예요.

📌 예제로 비교해 보기

1) 특정 지역만 조회 (WHERE 사용)

SELECT region, COUNT(*) 
FROM customer_data 
WHERE region = '서울'
GROUP BY region;

 

2) 가입자가 100명 이상인 지역만 조회 (HAVING 사용)

SELECT region, COUNT(*) AS total_users 
FROM customer_data 
GROUP BY region 
HAVING COUNT(*) >= 100;

 

같은 데이터셋이더라도 목적에 따라 WHERE 또는 HAVING 중 어떤 절을 써야 할지가 달라집니다.

조건이 행 단위냐, 그룹 단위냐가 핵심이에요!

💡 TIP: WHERE과 HAVING 같이 쓰기

두 절은 동시에 사용할 수 있습니다!

WHERE로 먼저 데이터를 필터링하고, 그 이후 HAVING으로 조건을 추가해 더 정교한 분석을 할 수 있어요.

SELECT region, COUNT(*) AS total_users
FROM customer_data
WHERE status = '활성'
GROUP BY region
HAVING COUNT(*) > 100;

 

3. HAVING 절 기본 예제

이제 HAVING 절이 어떤 역할을 하는지는 알았으니, 실제 예제를 통해 감을 잡아볼 시간이에요.

가장 기본적인 예제부터 단계별로 살펴보겠습니다.

📝 기본 예제: 상품별 주문 건수 필터링

상황: 어떤 쇼핑몰에서 상품별 주문 건수를 구한 뒤, 10건 이상 팔린 상품만 보고 싶다고 가정해볼게요.

SELECT product_name, COUNT(*) AS order_count
FROM orders
GROUP BY product_name
HAVING COUNT(*) >= 10;

 

이 쿼리는 주문 내역(orders) 테이블에서 상품별로 주문 수를 계산하고, 그 결과 중 10건 이상 주문된 상품만 출력합니다.

매출 상위 상품 분석이나 인기 상품 필터링에 아주 유용하죠.

📊 조건을 다양하게 바꿔보기

조건 HAVING 구문 예시
10건 이상 HAVING COUNT(*) >= 10
50건 미만 HAVING COUNT(*) < 50
정확히 100건 HAVING COUNT(*) = 100

HAVING 뒤에는 수치 비교 연산자, 논리 연산자 등도 자유롭게 조합해서 사용할 수 있어요.

예를 들어,

매출이 1,000만 원 이상이면서 주문 건수가 20건 이상인 상품을 추출하려면 다음처럼 쓰면 됩니다:

SELECT product_name, SUM(sales_amount) AS total_sales, COUNT(*) AS order_count
FROM orders
GROUP BY product_name
HAVING SUM(sales_amount) >= 10000000 AND COUNT(*) >= 20;

 

이제 HAVING 절이 어떤 식으로 응용되는지 조금 감이 오시죠? 😊

이런 기본 예제는 앞으로 이어질 실습에서도 꼭 필요하니까, 잘 익혀두세요!

 

 

4. 조건에 맞는 그룹만 필터링하기 🧐

이번에는 HAVING 절을 활용해서 특정 조건을 만족하는 그룹 데이터만 필터링하는 실전 예제를 알아볼게요.

이건 실무에서 굉장히 자주 쓰이는데,

예를 들어

고객별 총 주문 수, 지역별 총 매출, 회원 등급별 활동량 등을 비교할 때 유용하답니다.

👥 예제: 고객별 총 주문액이 50만 원 이상인 고객 조회

SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(order_amount) >= 500000;

 

이 쿼리는 각 고객의 총 주문 금액을 계산한 뒤, 50만 원 이상 지출한 고객만을 결과로 보여줍니다.

이런 방식은 마케팅 대상 고객 선정, 리텐션 분석, VIP 고객 식별 등에 많이 활용돼요.

📌 WHERE와 HAVING 같이 써서 필터링 정교화하기

“최근 1년간 주문 중에서만 조건을 적용하고 싶다”는 상황이라면?

그럴 땐 WHERE 절로 먼저 기간 조건을 걸고, HAVING 절로 그룹 조건을 걸면 됩니다!

SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
WHERE order_date >= '2024-04-01'
GROUP BY customer_id
HAVING SUM(order_amount) >= 500000;

 

이렇게 하면 2024년 4월 이후 주문 중, 50만 원 이상 지출한 고객만 추출할 수 있어요.

데이터 전처리를 적절히 조합하면, HAVING 절은 정말 강력한 무기가 된답니다.

💡 다양한 조건 조합해보기

  • HAVING AVG(order_amount) BETWEEN 10000 AND 50000: 평균 주문금액 조건
  • HAVING COUNT(DISTINCT product_id) > 5: 다양한 상품 구매한 고객

실제 업무에 HAVING을 적용해보면, 고객 세분화나 리포트 필터링을 굉장히 유연하게 할 수 있다는 걸 느끼게 될 거예요. 정말 잘 쓰면 기초 SQL에서 한 단계 올라선 느낌! ✨

 

 

5. 매출이 높은 상위 카테고리 조회하기 💰

이번엔 실무에서 아주 자주 등장하는 쿼리 실습이에요.

바로 매출 기준으로 상위 카테고리만 필터링해서 조회하는 상황입니다.

BI 보고서, 마케팅 분석, 사업전략 수립 등 수많은 실전 업무에서 이 로직은 매일같이 쓰여요!

💼 실전 예제: 매출 상위 카테고리 3개만 조회

카테고리별 매출을 집계한 뒤, 상위 3개만 출력하는 쿼리입니다.

SELECT category, SUM(sales_amount) AS total_sales
FROM orders
GROUP BY category
ORDER BY total_sales DESC
LIMIT 3;

 

이 쿼리는 HAVING 절이 아닌 ORDER BY + LIMIT을 통해 상위 n개 그룹을 추출하는 방식이에요.

그럼 HAVING은 어떤 역할을 할까요?

🧾 조건부 상위 필터링 예제

이번엔 “매출이 1억 이상인 카테고리만 출력하자”는 조건을 추가해볼게요.

SELECT category, SUM(sales_amount) AS total_sales
FROM orders
GROUP BY category
HAVING SUM(sales_amount) >= 100000000
ORDER BY total_sales DESC;

 

여기서는 HAVING 절이 매출 기준 필터링 역할을 합니다.

ORDER BY는 정렬만 담당하고, WHERE로는 할 수 없었던 집계 조건은 HAVING이 처리하는 거예요.

💡 같이 쓰면 강력한 조합

  1. HAVING으로 조건을 먼저 거르고
  2. ORDER BY로 순서를 정렬하고
  3. LIMIT으로 상위 n개만 보여주기

이 3단계 조합은 정말 자주 쓰이고, 보고서 자동화나 Top N 분석에 탁월한 성능을 보여줘요.

 

 

6. 정리 🧠

지금까지 HAVING 절에 대해 기본 개념부터 실전 예제까지 다양하게 알아봤어요.

처음엔 WHERE와의 차이가 헷갈릴 수 있지만, 막상 한두 번 써보면 금방 익숙해지실 거예요.

HAVING은 단순한 문법이 아니라 집계된 데이터를 조건에 맞게 필터링함으로써 SQL을 좀 더 분석적으로 사용할 수 있도록 만들어주는 강력한 도구입니다.

 

실무에서는 이런 식으로도 자주 써요:

  • 고객별 구매 패턴 분석 (재구매 고객 필터링)
  • 상위 성과 지점/카테고리/부서 분석
  • 조건부 KPI 리포트 필터링

 

이제 HAVING 절이 단순한 집계 함수 뒤에 붙는 보조 옵션이 아니라, 데이터 분석을 훨씬 정교하게 만드는 핵심 문법이라는 점, 이해되셨죠?

꼭 직접 쿼리를 짜보며 익혀보세요!

 

반응형
반응형

GROUP BY와 집계함수로 배우는 데이터 분석의 첫걸음

카테고리별 상품 수?
월별 가입자 수?
이제는 직접 SQL로 뽑아보세요!

 

 

안녕하세요, 여러분 😊

오늘은 데이터 그룹화(GROUP BY)집계함수(aggregation functions)에 대해 알아보려 합니다.

SQL에서 GROUP BY는 데이터를 요약하거나 집계할 때 아주 자주 등장하는 기능인데요,

COUNT, SUM, AVG 같은 집계함수와 함께 사용하면 통계 리포트를 만드는 건 물론, 비즈니스 인사이트까지 얻을 수 있답니다.

이번 글에서는 이 개념들을 이론적으로 정리하고, 실제로 어떤 식으로 실무에서 활용되는지 실습 예제를 통해 확인해 볼 거예요.

예를 들어

"카테고리별 상품 수", "월별 회원 가입자 수", "상품별 평균 가격" 같은 데이터, 궁금하지 않으세요?

오늘 딱 정리해드릴게요!

1. GROUP BY란 무엇인가요? 🤔

여러분, SQL로 데이터를 다루다 보면

"이 항목별로 몇 개나 있지?",

"카테고리별 평균은 얼마지?" 같은 질문, 자주 하게 되죠?

바로 그럴 때 사용하는 게 GROUP BY 구문이에요.

🔍 GROUP BY의 역할

GROUP BY는 지정한 컬럼의 값을 기준으로 레코드를 그룹화합니다.

그리고 각 그룹별로 집계함수(COUNT, SUM 등)를 적용할 수 있게 해주는 강력한 기능이죠.

📌 기본 문법 구조

SELECT 컬럼명, 집계함수()
FROM 테이블명
GROUP BY 컬럼명;

📋 예제: 상품 테이블을 기준으로

SELECT category, COUNT(*) AS 상품수
FROM products
GROUP BY category;

 

위 쿼리는 products 테이블에서 category별로 몇 개의 상품이 있는지를 알려줘요.

'식품', '가전', '의류' 등으로 묶어서 몇 개씩 있는지 보는 거죠!

📊 GROUP BY를 쓸 때 주의할 점

  • SELECT절에는 GROUP BY 컬럼 또는 집계함수만 포함할 수 있어요.
  • GROUP BY에 쓰인 컬럼은 결과에도 반드시 포함되어야 해요.
  • WHERE절은 그룹화 전에 필터링, HAVING절은 그룹화 후 필터링에 사용돼요.

🧠 한 줄 요약

GROUP BY는 데이터를 묶어서 요약하고 싶을 때 쓰는 SQL의 핵심 기능!

COUNT, SUM 같은 집계함수와 찰떡궁합이에요 💡

 

 

2. 집계함수의 기본 개념과 종류 🧮

GROUP BY와 함께 가장 많이 쓰이는 것이 바로 집계함수(aggregate functions)입니다.

이 함수들은 데이터를 요약해서 보여줄 때 아주 유용한데요,

쉽게 말해

"합계", "평균", "개수", "최대값", "최소값" 같은 걸 계산할 때 쓰는 함수들이에요.

📌 자주 사용하는 집계 함수 5가지

함수 설명 예시
COUNT() 데이터 개수를 셉니다. COUNT(*)
SUM() 값들의 총합을 계산합니다. SUM(price)
AVG() 평균값을 계산합니다. AVG(score)
MIN() 가장 작은 값을 찾습니다. MIN(age)
MAX() 가장 큰 값을 찾습니다. MAX(salary)

✅ 실제 사용 예시

SELECT category, COUNT(*) AS 상품수, SUM(price) AS 총매출
FROM products
GROUP BY category;

 

위 쿼리는 카테고리별 상품 수와 총 매출을 동시에 보여주는 대표적인 예시예요.

GROUP BY 없이 COUNT나 SUM만 쓰면 전체 합계만 구해지니까, 꼭 함께 써야 의미 있는 데이터가 나와요!

💡 TIP

  • COUNT는 NULL 값을 무시하지만 COUNT(*)는 NULL도 포함해요!
  • AVG는 숫자 컬럼에만 사용할 수 있어요. 문자열은 안 됩니다!

정리하자면,

집계함수는 단순히 값을 보는 데서 끝나는 게 아니라 분석의 방향성을 잡는 데 꼭 필요한 도구들이에요.

실무에서는 거의 필수! 👍

 

 

3. GROUP BY와 집계함수 함께 쓰기 🔗

지금까지 GROUP BY집계함수의 개념을 따로따로 살펴봤다면,

이제 이 둘을 실제로 조합해보는 실전 단계로 넘어가볼까요?

이 조합은 마치 커피와 설탕처럼, 함께 쓸 때 훨씬 맛있는(!) 결과를 내줘요 😄

💻 기본 사용 예제

SELECT region, COUNT(*) AS 고객수, AVG(age) AS 평균나이
FROM customers
GROUP BY region;

 

위 쿼리는 고객들을 region(지역)별로 묶은 후, 각 지역의 고객 수평균 나이를 보여줍니다.

요약하자면, GROUP BY는 묶고 집계함수는 계산한다는 거죠.

📌 WHERE절 vs HAVING절

구문 적용 시점 예시
WHERE GROUP BY 전에 레코드 필터링 WHERE age > 20
HAVING GROUP BY 후 그룹 필터링 HAVING COUNT(*) > 10

즉, WHERE은 그룹화 전에 개별 데이터를 거르고, HAVING은 그룹화된 결과에서 조건을 적용해요.

두 절을 동시에 사용할 수도 있다는 것도 기억해 두세요!

🔥 실무 감각 익히기: 다중 집계 함수

SELECT department, COUNT(*) AS 직원수, SUM(salary) AS 총급여, MAX(salary) AS 최고연봉
FROM employees
GROUP BY department;

 

이렇게 여러 집계 함수를 동시에 써서 부서별 통계 리포트를 뽑을 수 있어요.

분석 보고서 만들 때 자주 쓰이는 유형이니 익혀두면 정말 유용하답니다.

📣 한 문장 요약!

GROUP BY + 집계함수 = 실무 보고서의 기본 구조!

쿼리를 구성할 때 WHERE, HAVING, SELECT의 순서를 꼭 신경 써주세요 🛠️

 

 

4. 실전 예제 ① : 카테고리별 상품 수와 매출 구하기 🛍️

이제 이론은 충분히 봤으니, 진짜 데이터를 기준으로 실습을 해봐야겠죠?

가장 자주 사용되는 예제 중 하나인 카테고리별 상품 수와 총 매출 구하기를 같이 해봅시다!

🗂️ 가정 테이블: products

컬럼명 설명
product_id 상품 고유 ID
product_name 상품명
category 상품 카테고리
price 상품 가격

💡 목표

  • 각 카테고리마다 상품이 몇 개 있는지 세기
  • 각 카테고리별 상품의 가격 합계를 구하기

🧑‍💻 SQL 예제

SELECT category, COUNT(*) AS 상품수, SUM(price) AS 총매출
FROM products
GROUP BY category;

 

이 쿼리는 카테고리 기준으로 데이터를 그룹화하고, 각 그룹별로 상품 개수와 총 가격을 계산합니다.

정말 실무에서 많이 쓰이는 유형이에요!

📊 결과 예시

category 상품수 총매출
전자기기 5 1,200,000
의류 8 950,000
식품 12 480,000

✅ 정리

카테고리별로 데이터를 그룹화한 뒤, COUNT()SUM()을 조합하면 상품 수와 매출을 한눈에 볼 수 있어요.

이건 마케팅, 판매, 재고 분석 등 여러 부서에서 애용하는 대표 쿼리랍니다!

 

 

 

5. 실전 예제 ② : 월별 회원 가입자 수 구하기 📆

이번에는 시간 기준으로 데이터를 그룹화하는 방법을 소개할게요.

예를 들어,

"2024년 3월에 가입한 회원 수는 몇 명일까?" 같은 질문에 답하려면 날짜 데이터를 월 단위로 그룹화해야 해요.

이건 정말 다양한 실무 분석 리포트에서 핵심적인 쿼리랍니다!

📁 가정 테이블: members

컬럼명 설명
member_id 회원 고유 번호
join_date 가입일 (DATE 형식)
email 이메일 주소

🧑‍💻 SQL 예제: 월별 그룹화

SELECT DATE_FORMAT(join_date, '%Y-%m') AS 가입월, COUNT(*) AS 가입자수
FROM members
GROUP BY 가입월
ORDER BY 가입월;

 

여기서 핵심은 DATE_FORMAT(join_date, '%Y-%m') 구문입니다.

가입일에서 연도-월(YYYY-MM)만 추출해서 그룹화하는 거죠.

📊 결과 예시

가입월 가입자수
2024-01 143
2024-02 167
2024-03 194

📌 정리

시간 데이터를 분석할 때는 반드시 그룹핑 포맷을 지정해줘야 해요.

'월', '분기', '연도' 단위로 자유롭게 요약이 가능하고, 마케팅 타이밍 분석, 사용자 행동 패턴 파악 등에 아주 유용하죠!

정말 이건 써보면 무조건 배우게 되는 기능이에요 😎

 

 

6. 마무리 🧾

오늘은 SQL에서 GROUP BY집계함수를 활용하는 핵심 개념과 실전 예제를 함께 살펴봤어요.

단순한 데이터 나열을 넘어, 카테고리별 분석, 월별 추이 분석까지 할 수 있다는 건 정말 매력적인 부분이죠.

 

특히나 COUNT(), SUM(), AVG() 같은 함수들은 실무 리포트 작성 시 거의 필수라고 해도 과언이 아니에요.

여기에 DATE_FORMAT과 같은 날짜 가공까지 잘 활용하면, 원하는 데이터를 뽑아내는 능력은 몇 단계 업그레이드됩니다 🚀

처음에는 살짝 복잡하고 헷갈릴 수 있지만, 실습을 반복하다 보면 자연스럽게 손에 익을 거예요.

 

다음 시간에는 HAVING절 활용법, 서브쿼리 등을 추가로 소개하며 좀 더 복합적인 분석을 해볼게요.

직접 SQL로 실습해보는 거, 꼭 추천드립니다.

"눈으로 보지 말고 손으로 실행하라!" 이 말, 데이터 공부에선 진짜 진리예요 😄

반응형

+ Recent posts