이번 포스팅에서는 데이터를 그룹별로 집계해 볼 것이다.
우리는 실무에서 이런 질문을 자주 받는다.
- "유저마다 구매 수는 몇 건이야?"
- "기기별 로그인 평균은?"
- "날짜별로 이용자 수를 세려면?"
이때 꼭 써야 하는 도구가 바로 GROUP BY와 집계 함수다.
| 집계함수
이 함수들은 반드시 GROUP BY와 함께 써야만 그룹별 결과를 확인할 수 있다.
COUNT() | 행의 개수를 센다 |
SUM() | 숫자 값의 합계를 구한다 |
AVG() | 숫자 값의 평균을 구한다 |
| Tip - 집계 함수에서 NULL 처리 방식
함수 | NULL 포함 시 처리 방식 |
SUM() | NULL은 무시됨. NULL은 합계에 영향을 주지 않음 |
AVG() | NULL은 무시됨. NULL이 아닌 값들만 평균 계산에 사용됨 |
COUNT(*) | NULL 포함 모든 행을 셈 |
COUNT(컬럼) | 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;
오늘도 고생했다!
'5분 SQL' 카테고리의 다른 글
[MYSQL 07] CASE WHEN 개념과 실습 (0) | 2025.04.27 |
---|---|
[MYSQL 06] HAVING / MIN / MAX 개념과 실습 (0) | 2025.04.26 |
[MYSQL 04] IS NULL / IS NOT NULL / IFNULL / COALESCE 개념과 실습 (0) | 2025.04.23 |
[MYSQL 03] IN / BETWEEN / LIKE 개념과 실습 (0) | 2025.04.22 |
[MYSQL 02] ORDER BY, LIMIT 개념과 실습 (0) | 2025.04.21 |