MySQL에서 데이터를 분석하다 보면 전체가 아닌 그룹별로 특정 열의 최댓값을 구해야 하는 경우가 자주 있습니다. 예를 들어 상품 카테고리별 최고 가격, 부서별 최고 연봉처럼 말이죠. 이럴 때는 GROUP BY 절과 MAX() 집계 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
기본 문법
그룹별 최댓값을 조회하는 기본적인 쿼리 형식은 다음과 같습니다.
SELECT colName1, MAX(colName2) FROM tableName GROUP BY colName1 ORDER BY colName1;
각 절의 역할을 정리하면 다음과 같습니다.
- MAX(colName2): 그룹 내에서 해당 열의 최댓값을 계산합니다.
- GROUP BY colName1: 지정한 열의 값이 같은 행들을 하나의 그룹으로 묶습니다.
- ORDER BY colName1: 결과를 기준 열 순서대로 정렬하여 가독성을 높입니다.
실전 예제
이제 실제 예제를 통해 동작 방식을 확인해 보겠습니다. 다음과 같은 PRODUCT 테이블이 있다고 가정해 보겠습니다.
<PRODUCT>
+---------+--------+ | Article | Price | +---------+--------+ | 1 | 255.50 | | 1 | 256.05 | | 2 | 90.50 | | 3 | 120.50 | | 3 | 123.10 | | 3 | 122.10 | +---------+--------+
이 테이블에는 Article(상품 번호)별로 여러 개의 Price(가격) 데이터가 저장되어 있습니다. 이제 상품 번호별로 가장 높은 가격을 조회해 보겠습니다.
쿼리 작성
그룹별 최댓값을 가져오는 쿼리는 다음과 같습니다.
SELECT Article, MAX(Price) AS MaxPrice FROM Product GROUP BY Article ORDER BY Article;
AS MaxPrice를 사용하면 집계 결과 열에 별칭을 지정할 수 있어 출력 결과를 더 명확하게 표현할 수 있습니다.
실행 결과
+--------------+--------------+ | Article | MaxPrice | +--------------+--------------+ | 0001 | 256.05 | | 0002 | 90.50 | | 0003 | 123.10 | +--------------+--------------+
결과 해석
실행 결과를 보면 각 상품 번호(Article)별로 한 행씩만 반환되며, 해당 그룹 내에서 가장 높은 가격(MaxPrice)이 표시됩니다.
- Article 1번: 두 개의 가격(255.50, 256.05) 중 최댓값인 256.05가 선택되었습니다.
- Article 2번: 단일 행이므로 그대로 90.50이 반환되었습니다.
- Article 3번: 세 개의 가격(120.50, 123.10, 122.10) 중 최댓값인 123.10이 선택되었습니다.
이처럼 GROUP BY와 MAX()를 조합하면 복잡한 서브쿼리 없이도 그룹별 최댓값을 손쉽게 조회할 수 있습니다. 참고로 최솟값이 필요한 경우에는 MIN(), 평균은 AVG(), 합계는 SUM() 함수를 같은 방식으로 활용하면 됩니다.