5분 SQL

[MYSQL 05] GROUP BY / COUNT / SUM / AVG 개념과 실습

nightquery 2025. 4. 24. 21:59

이번 포스팅에서는 데이터를 그룹별로 집계해 볼 것이다.

우리는 실무에서 이런 질문을 자주 받는다.

  • "유저마다 구매 수는 몇 건이야?"
  • "기기별 로그인 평균은?"
  • "날짜별로 이용자 수를 세려면?"

이때 꼭 써야 하는 도구가 바로 GROUP BY와 집계 함수다.

 

 

| 집계함수

이 함수들은 반드시 GROUP BY와 함께 써야만 그룹별 결과를 확인할 수 있다.

COUNT() 행의 개수를 센다
SUM() 숫자 값의 합계를 구한다
AVG() 숫자 값의 평균을 구한다

 

 

| Tip - 집계 함수에서 NULL 처리 방식

함수 NULL 포함 시 처리 방식
SUM() NULL은 무시됨. NULL은 합계에 영향을 주지 않음
AVG() NULL은 무시됨. NULL이 아닌 값들만 평균 계산에 사용됨
COUNT(*) NULL 포함 모든 행을 셈
COUNT(컬럼) NULL 제외, 값이 있는 행만 셈

집계 함수에서 null 처리 예시

 

 

 

 

| 실습 테이블

SQL은 직접 쿼리를 실행하고 수정해보는 게 핵심!
아직 실습 환경이 없다면, 아래 글을 참고해 DBeaver와 MySQL부터 먼저 세팅해 보자
[SQL] 공부/실습 환경 세팅 – DBeaver + MySQL

 

[SQL] 공부/실습 환경 세팅 – DBeaver + MySQL

IT 직장에서의 N년차, SQL은 선택이 아니라 필수라는 것을 느겼다.24년에 자격증 취득하고 실무에서 조금씩 써먹는 중인데 처음에 겁먹었던 것이 무색하게 할 만하다. 앞으로의 포스팅들은 SQL을

happynestledays.tistory.com

 

CREATE DATABASE IF NOT EXISTS sql_blog;
USE sql_blog;

DROP TABLE IF EXISTS user_activity_log;

CREATE TABLE user_activity_log (
  log_id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  action VARCHAR(50),
  device VARCHAR(50),
  created_at DATETIME
);

INSERT INTO user_activity_log (user_id, action, device, created_at) VALUES
(101, 'login', 'mobile', '2024-04-18 08:12:00'),
(102, 'search', 'web', '2024-04-18 09:05:00'),
(101, 'purchase', 'mobile', '2024-04-18 09:40:00'),
(103, 'logout', 'web', '2024-04-18 10:15:00'),
(102, 'purchase', 'mobile', '2024-04-18 11:00:00'),
(101, 'search', 'web', '2024-04-18 11:30:00');

 

 

 

 

 


 

1. 기본 예제 – 그룹별 개수 집계 (COUNT)

● user_id 기준으로 전체 활동 수 구하기

SELECT user_id, COUNT(*) AS record_count
FROM user_activity_log
GROUP BY user_id;

 

 

 

2. 실무 예제 – 시간대별  개수 집계 (HOUR + COUNT)

created_at에서 시간만 추출해 시간대별 활동 수 구하기

SELECT HOUR(created_at) AS hour_block, COUNT(*) AS activity_count
FROM user_activity_log
GROUP BY HOUR(created_at)
ORDER BY hour_block;

 

 

 

3. 실무 예제 – 조건 필터 후 그룹별 집계 (WHERE + COUNT)

action 값이 'purchase'인 user_id 그룹별 행 개수 구하기

SELECT user_id, COUNT(*) AS purchase_count
FROM user_activity_log
WHERE action = 'purchase'
GROUP BY user_id;

 

 

 

4. 실무 예제 – 그룹별 최대값 집계 (MAX + GROUP BY)

user_id 기준으로 마지막 활동 시각(created_at) 조회하기

SELECT user_id, MAX(created_at) AS last_activity_time
FROM user_activity_log
GROUP BY user_id;

 

 

 

 

5. 실무 예제 – 조건 필터 후 평균값 추출 (WHERE + AVG)

action 값이 'purchase'인 device 그룹별 시간(HOUR) 평균 구하기

SELECT device, 
       AVG(HOUR(created_at)) AS avg_hour
FROM user_activity_log
WHERE action = 'purchase'
GROUP BY device;

 

 

 

 

오늘도 고생했다!