Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL GROUP BY와 MIN() 함수로 중복된 열 값별 최소값 조회하는 방법

데이터베이스를 다루다 보면 동일한 값이 중복되어 저장된 열에서, 각 중복 그룹별로 최소값을 가진 행을 조회해야 하는 경우가 자주 발생합니다. 이번 글에서는 MySQL의 GROUP BY 절과 MIN() 집계 함수를 활용하여 중복된 Class 값별로 가장 작은 Amount 값을 선택하는 방법을 단계별로 알아보겠습니다.

1. 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다. Id는 자동 증가되는 기본 키로 설정하고, Class와 Amount 열을 포함시킵니다.

mysql> create table DemoTable1875
   (
   Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   Class varchar(20),
   Amount int
   );
Query OK, 0 rows affected (0.00 sec)

2. 데이터 삽입

insert 명령을 사용하여 테이블에 레코드를 삽입합니다. Class 값 'X'와 'Z'는 각각 여러 번 중복되어 들어가도록 구성했습니다.

mysql> insert into DemoTable1875(Class,Amount) values('X',750);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1875(Class,Amount) values('X',140);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1875(Class,Amount) values('X',450);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1875(Class,Amount) values('Y',6780);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1875(Class,Amount) values('Z',1350);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1875(Class,Amount) values('Z',2050);
Query OK, 1 row affected (0.00 sec)

3. 전체 데이터 확인

select 문을 사용하여 테이블에 저장된 모든 레코드를 조회합니다.

mysql> select * from DemoTable1875;

위 쿼리는 다음과 같은 결과를 출력합니다.

+----+-------+--------+
| Id | Class | Amount |
+----+-------+--------+
|  1 | X     |    750 |
|  2 | X     |    140 |
|  3 | X     |    450 |
|  4 | Y     |    6780 |
|  5 | Z     |    1350 |
|  6 | Z     |    2050 |
+----+-------+--------+
6 rows in set (0.00 sec)

4. 중복 값별 최소값 조회 쿼리

이제 GROUP BY 절로 Class 값을 그룹화하고, MIN() 함수로 각 그룹의 최소 Amount 값을 조회합니다.

mysql> select Class,Min(Amount) from DemoTable1875 group by Class;

실행 결과는 다음과 같습니다.

+-------+-------------+
| Class | Min(Amount) |
+-------+-------------+
| X     |         140 |
| Y     |        6780 |
| Z     |        1350 |
+-------+-------------+
3 rows in set (0.00 sec)

결과 분석

쿼리 결과를 보면 중복된 Class 값들이 하나의 그룹으로 묶여 처리된 것을 확인할 수 있습니다.

Class 'X'의 경우 750, 140, 450 중 최소값인 140이 반환되었고, Class 'Y'는 레코드가 하나뿐이므로 그대로 6780이, Class 'Z'는 1350과 2050 중 최소값인 1350이 조회되었습니다.

이처럼 GROUP BYMIN() 함수를 함께 사용하면 중복된 열 값을 기준으로 그룹을 나누고, 각 그룹에서 최소값을 손쉽게 추출할 수 있습니다. 같은 방식으로 MAX(), AVG(), SUM() 등 다른 집계 함수도 활용할 수 있으니 상황에 맞게 응용해 보시기 바랍니다.