본문 바로가기
SQL

집계 함수 & GROUP BY & HAVING - MySQL

by 바른곰의 SQL천국 2025. 7. 25.

집계 함수 - 여러 행(row)의 값을 하나의 결과값으로 요약해주는 함수

 

- 왜 사용하는 가?

  • 수많은 데이터를 하나의 숫자나 지표로 축약하여 보여주기 위해

 

- 집계 함수의 종류

 

- 예시

 

아래와 같은 테이블이 있다고 가정하고 각 집계 함수별로 예시를 확인해 보자.

+----------+---------+--------+
| order_id | user_id | amount |
+----------+---------+--------+
| 101      | 1       | 100.00 |
| 102      | 1       | 150.00 |
| 103      | 2       | 200.00 |
| 104      | 3       |  NULL  |
+----------+---------+--------+

 

 

1. COUNT( ) - 행의 개수를 세어줌 (NULL 은 제외)

SELECT COUNT(*) AS total_orders FROM orders

 

출력 결과 :

 

total_orders
4

 

 

2. SUM( ) - 컬럼의 총합

SELECT SUM(amount) AS total_amount FROM orders

 

출력 결과 :

 

total_amount
450.00

 

 

3. AVG( ) - 컬럼의 평균

SELECT AVG(amount) AS avg_amount FROM orders

 

출력 결과 :

 

avg_amount
150.00

 

 

4. MIN( ) / MAX( ) - 가장 작은 값 / 가장 큰 값

SELECT
    MIN(amount) AS min_amt
    MAX(amount) AS max_amt
FROM orders

 

출력 결과 :

 

min_amt max_amt
100.00 200.00

 

 

5. GROUP_CONCAT ( ) - 그룹별 문자열 연결

SELECT
  user_id,
  GROUP_CONCAT(order_id) AS order_list
FROM orders
GROUP BY user_id

 

출력 결과 :

 

user_id order_list
1 101,102
2 103
3 104

 

 

 


 

GROUP BY - 지정한 컬럼을 기준으로 데이터를 그룹화

 

- 왜 사용하는 가?

  • 그룹별로 데이터를 요약하기 위해
  • 사용자별 총 주문 금액은?, 지역별 평균 수입은? 같은 질문에 답하기 위해

 

 

HAVING - 그룹화된 데이터를 필터링

 

- 왜 사용하는 가?

  • 그룹별 집계 결과에 조건을 걸기 위해
  • 총 주문 금액이 200 이상인 사용자?, 평균 점수가 80점 이상인 학생? 같은 질문에 답하기 위해

 

- WHERE 과의 차이점

  • WHERE 은 그룹(group) 묶기 전 필터링
  • HAVING 은 그룹(group) 묶은 다음 필터링

 

- 예시

 

아래와 같은 테이블이 있다고 가정하고 각 집계 함수별로 예시를 확인해 보자.

+----------+---------+--------+
| order_id | user_id | amount |
+----------+---------+--------+
| 101      | 1       | 100.00 |
| 102      | 1       | 150.00 |
| 103      | 2       | 200.00 |
| 104      | 3       |  NULL  |
+----------+---------+--------+

 

 

1. 사용자별 총 주문 금액을 구해라

SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id

 

출력 결과 :

 

user_id total_amount
1 250.00
2 200.00
3 NULL

 

 

2. 총 주문 금액이 200 이상인 사용자만 보기

SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id
HAVING total_amount >= 200

 

출력 결과 :

 

user_id total_amount
1 250.00
2 200.00

 

 

3. 주문 횟수가 2회 이상인 사용자만 보기

SELECT user_id, COUNT(amount) AS order_count
FROM orders
GROUP BY user_id
HAVING order_count >= 2

 

출력 결과 :

 

user_id order_count
1 2