데이터베이스 작업을 하다 보면 같은 이름이나 키가 여러 번 등장하는 중복 레코드를 자주 만나게 됩니다. 예를 들어 학생별 시험 점수가 여러 행으로 저장되어 있을 때, 학생 이름별로 점수를 하나로 합쳐야 하는 경우가 있죠. 이럴 때 GROUP BY 절과 SUM() 집계 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
-> (
-> StudentName varchar(20),
-> StudentMarks int
-> );
Query OK, 0 rows affected (0.68 sec)
2. 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다. Chris와 David의 이름이 각각 두 번씩 등록되어 있다는 점에 주목하세요.
mysql> insert into DemoTable values('Chris',50);
Query OK, 1 row affected (0.61 sec)
mysql> insert into DemoTable values('David',70);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values('Chris',80);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('David',90);
Query OK, 1 row affected (0.24 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회합니다.
mysql> select * from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 50 | | David | 70 | | Chris | 80 | | David | 90 | +-------------+--------------+ 4 rows in set (0.00 sec)
4. 중복 레코드 합산하기
이제 핵심 단계입니다. GROUP BY로 학생 이름을 기준으로 그룹화하고, SUM()으로 각 그룹의 점수 합계를 계산합니다.
mysql> select StudentName,sum(StudentMarks) from DemoTable group by StudentName;
결과는 다음과 같습니다.
+-------------+-------------------+ | StudentName | sum(StudentMarks) | +-------------+-------------------+ | Chris | 130 | | David | 160 | +-------------+-------------------+ 2 rows in set (0.00 sec)
결과 해석
Chris의 점수(50 + 80)는 130, David의 점수(70 + 90)는 160으로, 중복된 이름별로 점수가 깔끔하게 합산되어 출력되었습니다.
추가 팁
- 합계 대신 평균이 필요하다면
SUM()대신AVG()함수를 사용하면 됩니다. - 결과 열 이름을 더 읽기 좋게 바꾸려면 별칭(alias)을 활용하세요. 예:
sum(StudentMarks) AS TotalMarks - 특정 조건에 맞는 데이터만 합산하려면
WHERE절을, 그룹화된 결과에 조건을 적용하려면HAVING절을 사용할 수 있습니다.