MySQL에서 여러 열을 대상으로 GROUP BY와 MAX 함수를 함께 사용하는 방법을 이해하기 위해, 먼저 예제 테이블을 생성해 보겠습니다.
1. 테이블 생성하기
아래 쿼리로 테이블을 생성합니다.
mysql> create table GroupByMaxDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CategoryId int,
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.68 sec)
2. 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 샘플 레코드를 추가합니다.
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,100,50);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,100,70);
Query OK, 1 row affected (0.21 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,50,100);
Query OK, 1 row affected (0.22 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(20,180,150);
Query OK, 1 row affected (0.19 sec)
3. 전체 레코드 조회하기
SELECT 문을 사용하여 테이블의 모든 레코드를 확인합니다.
mysql> select *from GroupByMaxDemo;
출력 결과
+----+------------+--------+--------+
| Id | CategoryId | Value1 | Value2 |
+----+------------+--------+--------+
| 1 | 10 | 100 | 50 |
| 2 | 10 | 100 | 70 |
| 3 | 10 | 50 | 100 |
| 4 | 20 | 180 | 150 |
+----+------------+--------+--------+
4 rows in set (0.00 sec)
4. 여러 열에 GROUP BY와 MAX 적용하기
여기서 목표는 각 카테고리(CategoryId)별로 Value1의 최댓값을 구하고, 그중 Value2가 가장 큰 값까지 함께 조회하는 것입니다. 단순히 GROUP BY만 사용하면 원하는 결과를 얻기 어렵기 때문에, 서브쿼리와 INNER JOIN을 활용한 방식을 사용합니다.
다음은 여러 열에 GROUP BY와 MAX를 적용하는 쿼리입니다.
mysql> select tbl2.CategoryId, tbl2.Value1, max(tbl2.Value2)
-> from
-> (
-> select CategoryId, max(Value1) as `Value1`
-> from GroupByMaxDemo
-> group by CategoryId
-> ) tbl1
-> inner join GroupByMaxDemo tbl2 on tbl2.CategoryId = tbl1.CategoryId and tbl2.Value1 = tbl1.Value1
-> group by tbl2.CategoryId, tbl2.Value1;
출력 결과
+------------+--------+------------------+
| CategoryId | Value1 | max(tbl2.Value2) |
+------------+--------+------------------+
| 10 | 100 | 70 |
| 20 | 180 | 150 |
+------------+--------+------------------+
2 rows in set (0.00 sec)
쿼리 동작 원리 살펴보기
위 쿼리는 두 단계로 나누어 동작합니다.
첫 번째 단계(서브쿼리 tbl1): CategoryId별로 Value1의 최댓값을 계산합니다. 카테고리 10에서는 100, 카테고리 20에서는 180이 됩니다.
두 번째 단계(조인 및 그룹화): 서브쿼리 결과를 원본 테이블과 조인하여, 각 카테고리에서 Value1이 최댓값인 행들만 남깁니다. 이후 CategoryId와 Value1 기준으로 다시 그룹화하면서 Value2의 최댓값을 구합니다.
그 결과, 카테고리 10에서는 Value1이 100인 행 중 Value2의 최댓값인 70이, 카테고리 20에서는 180과 150이 반환됩니다. 이처럼 서브쿼리와 조인을 결합하면 MySQL에서 여러 열에 대한 최댓값 집계를 정확하게 수행할 수 있습니다.