MySQL에서는 동일한 ID가 여러 번 중복되어 저장된 데이터에서 각 ID에 해당하는 열의 최솟값을 구해야 하는 경우가 자주 발생합니다. 이럴 때 GROUP BY 절과 MIN() 집계 함수를 함께 사용하면 손쉽게 해결할 수 있습니다.
기본 문법
중복된 ID가 있는 열에서 해당 그룹별 최솟값을 가져오려면 아래와 같이 GROUP BY와 MIN()을 조합하여 쿼리를 작성합니다.
select min(yourColumnName) from yourTableName group by yourColumnName;
예제 테이블 생성하기
먼저 위 문법을 실습하기 위해 테스트용 테이블을 생성해 보겠습니다. Id와 Price 두 개의 컬럼으로 구성된 테이블입니다.
mysql> create table DemoTable2005
(
Id int,
Price float
);
Query OK, 0 rows affected (0.71 sec)데이터 삽입하기
insert 명령문을 사용하여 테이블에 레코드를 추가합니다. 이 예제에서는 의도적으로 동일한 Id(1)를 가진 두 개의 레코드를 삽입합니다.
mysql> insert into DemoTable2005 values(1,56.88); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable2005 values(1,120.56); Query OK, 1 row affected (0.23 sec)
저장된 데이터 확인하기
select 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable2005;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------+--------+ | Id | Price | +------+--------+ | 1 | 56.88 | | 1 | 120.56 | +------+--------+ 2 rows in set (0.00 sec)
중복 ID 기준 최솟값 조회하기
이제 중복된 Id 컬럼을 기준으로 Price 컬럼의 최솟값을 구하는 쿼리를 실행해 보겠습니다.
mysql> select min(Price) from DemoTable2005 group by Id;
실행 결과는 다음과 같습니다.
+------------+ | min(Price) | +------------+ | 56.88 | +------------+ 1 row in set (0.00 sec)
결과 분석
쿼리 결과를 보면 GROUP BY Id 절이 동일한 Id 값을 가진 레코드들을 하나의 그룹으로 묶고, MIN(Price) 함수가 각 그룹 내에서 가장 작은 가격인 56.88을 반환한 것을 확인할 수 있습니다. 만약 여러 개의 서로 다른 Id가 있다면 각 Id별로 최솟값이 별도의 행으로 출력됩니다.
이처럼 GROUP BY와 MIN() 함수를 활용하면 중복 데이터가 포함된 테이블에서도 원하는 그룹 단위의 최솟값을 간단하고 효율적으로 조회할 수 있습니다.