데이터베이스 작업을 하다 보면 동일한 값이 여러 번 반복되는 열(중복 값)에서 각 그룹별 최대값을 구해야 하는 경우가 자주 있습니다. MySQL에서는 GROUP BY 절과 MAX() 집계 함수를 함께 사용하면 이를 간단하게 해결할 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable(
ProductName varchar(100),
ProductPrice int
);
Query OK, 0 rows affected (0.68 sec)
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 레코드를 추가합니다. 여기서는 ProductName에 중복된 값이 존재하도록 데이터를 입력했습니다.
mysql> insert into DemoTable values('Product-1',56);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Product-2',78);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values('Product-1',88);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Product-2',86);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Product-1',45);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('Product-3',90);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Product-2',102);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('Product-3',59);
Query OK, 1 row affected (0.13 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+--------------+
| ProductName | ProductPrice |
+-------------+--------------+
| Product-1 | 56 |
| Product-2 | 78 |
| Product-1 | 88 |
| Product-2 | 86 |
| Product-1 | 45 |
| Product-3 | 90 |
| Product-2 | 102 |
| Product-3 | 59 |
+-------------+--------------+
8 rows in set (0.00 sec)
4. 중복 값별 최대값 조회하기
다음은 중복된 열 값에서 최대 해당 값을 가져오는 쿼리입니다. Product-1, Product-2처럼 중복된 ProductName을 기준으로 그룹화한 뒤, 각 그룹의 최대 ProductPrice를 구합니다.
mysql> select ProductName,MAX(ProductPrice) from DemoTable group by ProductName;
실행 결과는 다음과 같습니다.
+-------------+-------------------+
| ProductName | MAX(ProductPrice) |
+-------------+-------------------+
| Product-1 | 88 |
| Product-2 | 102 |
| Product-3 | 90 |
+-------------+-------------------+
3 rows in set (0.00 sec)
정리
결과를 보면 Product-1은 88, Product-2는 102, Product-3은 90으로 각 제품명(중복 값)별로 가장 큰 가격만 추출된 것을 확인할 수 있습니다. 이처럼 GROUP BY로 중복 열을 묶고 MAX() 함수를 적용하면 원하는 최대값을 손쉽게 얻을 수 있습니다. 참고로 최소값이 필요하면 MIN(), 평균값이 필요하면 AVG() 등 다른 집계 함수도 같은 방식으로 활용할 수 있습니다.