Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 열별로 그룹화하고 합계 표시하기 – GROUP BY와 HAVING 절 활용법

MySQL에서 특정 열을 기준으로 데이터를 그룹화하고, 각 그룹의 값 합계를 구한 뒤 조건에 맞는 결과만 필터링하려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable782 (
Name varchar(100),
Score int
);
Query OK, 0 rows affected (1.18 sec)

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용해 테이블에 여러 개의 레코드를 입력합니다.

mysql> insert into DemoTable782 values('John',156);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable782 values('Carol',250);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable782 values('Bob',140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('John',126);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable782 values('John',140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob',280);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob',250);
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable782 values('Carol',189);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Carol',299);
Query OK, 1 row affected (0.21 sec)

3. 전체 데이터 확인하기

SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable782;

위 쿼리는 다음과 같은 결과를 출력합니다.

+-------+-------+
| Name | Score |
+-------+-------+
| John | 156 |
| Carol | 250 |
| Bob | 140 |
| John | 126 |
| John | 140 |
| Bob | 280 |
| Bob | 250 |
| Carol | 189 |
| Carol | 299 |
+-------+-------+
9 rows in set (0.00 sec)

4. GROUP BY와 HAVING으로 그룹별 합계 조회하기

다음은 이름(Name) 열을 기준으로 데이터를 그룹화하고, 각 이름별 점수(Score)의 합계를 계산한 뒤, 합계가 500보다 큰 그룹만 표시하는 쿼리입니다.

mysql> select Name,SUM(Score) AS Total
from DemoTable782
group by Name
HAVING Total > 500;

실행 결과는 다음과 같습니다.

+-------+-------+
| Name | Total |
+-------+-------+
| Carol | 738 |
| Bob | 670 |
+-------+-------+
2 rows in set (0.00 sec)

쿼리 동작 원리

SUM(Score) AS Total은 각 그룹의 점수를 모두 더한 값을 'Total'이라는 별칭으로 출력합니다. GROUP BY Name은 동일한 이름을 가진 행들을 하나의 그룹으로 묶고, HAVING Total > 500은 집계된 합계가 500을 초과하는 그룹만 최종 결과에 남깁니다.

참고로 WHERE 절은 그룹화 이전의 개별 행에 조건을 적용하는 반면, HAVING 절은 GROUP BY로 집계된 이후의 결과에 조건을 적용한다는 점이 핵심 차이입니다. 실제로 John의 점수 합계는 156 + 126 + 140 = 422로 500 이하이기 때문에 결과에서 제외되었습니다.