데이터베이스 작업을 하다 보면 동일한 고객 ID가 여러 번 등록되어 있고, 각 ID에 해당하는 여러 금액 값 중에서 가장 큰 값(최대값)만 추출해야 하는 경우가 자주 발생합니다. MySQL에서는 MAX() 집계 함수와 GROUP BY 절을 함께 사용하면 이 문제를 아주 간단하게 해결할 수 있습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 만들어 보겠습니다. 고객 ID(CustomerId)와 금액(Amount) 두 개의 컬럼으로 구성된 테이블입니다.
mysql> create table DemoTable2003
(
CustomerId int,
Amount int
);
Query OK, 0 rows affected (0.65 sec)2. 샘플 데이터 삽입하기
이제 INSERT 명령어를 사용해 중복된 고객 ID를 포함한 데이터를 입력합니다. 고객 101과 102의 데이터가 각각 여러 건 존재하도록 구성했습니다.
mysql> insert into DemoTable2003 values(101,560); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable2003 values(102,1080); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable2003 values(101,570); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable2003 values(102,870); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable2003 values(101,460); Query OK, 1 row affected (0.12 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable2003;
실행 결과는 다음과 같습니다.
+------------+--------+ | CustomerId | Amount | +------------+--------+ | 101 | 560 | | 102 | 1080 | | 101 | 570 | | 102 | 870 | | 101 | 460 | +------------+--------+ 5 rows in set (0.00 sec)
위 결과를 보면 고객 ID 101은 3건(560, 570, 460), 고객 ID 102는 2건(1080, 870)의 데이터가 중복되어 저장되어 있는 것을 확인할 수 있습니다.
4. MAX()와 GROUP BY로 최고 금액 조회하기
이제 핵심인 쿼리입니다. GROUP BY로 고객 ID별로 데이터를 그룹화한 뒤, MAX() 함수로 각 그룹 내 최대 금액을 구합니다.
mysql> select CustomerId, max(Amount) from DemoTable2003
group by CustomerId;실행 결과는 다음과 같습니다.
+------------+-------------+ | CustomerId | max(Amount) | +------------+-------------+ | 101 | 570 | | 102 | 1080 | +------------+-------------+ 2 rows in set (0.00 sec)
결과 해석
- 고객 ID 101: 560, 570, 460 중 최대값인 570이 반환되었습니다.
- 고객 ID 102: 1080, 870 중 최대값인 1080이 반환되었습니다.
이처럼 GROUP BY CustomerId가 중복된 ID를 기준으로 행들을 그룹으로 묶어 주고, MAX(Amount)가 각 그룹 안에서 가장 큰 금액 하나만 선택해 주기 때문에 원하는 결과를 손쉽게 얻을 수 있습니다.
추가 팁
최소값이 필요하다면 MIN(), 평균값이 필요하다면 AVG(), 합계가 필요하다면 SUM() 함수를 같은 방식으로 사용하면 됩니다. 또한 결과 컬럼명을 더 읽기 좋게 바꾸고 싶다면 별칭(alias)을 활용하는 것도 좋습니다.
select CustomerId, max(Amount) as HighestAmount from DemoTable2003 group by CustomerId;
이렇게 하면 결과 컬럼이 HighestAmount라는 명확한 이름으로 표시되어 가독성이 한층 향상됩니다.