여러 행(그룹)에 대해 각각의 최소값을 동시에 조회하려면 MIN() 함수와 서브쿼리(subquery)를 함께 사용하면 됩니다. 이번 글에서는 테이블 생성부터 원하는 결과를 얻는 쿼리까지 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 이름(Name)과 점수(Score)를 저장할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Name varchar(20),
-> Score int
-> );
Query OK, 0 rows affected (0.56 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 테스트용 레코드를 추가합니다.
mysql> insert into DemoTable values('John',56);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('John',45);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable values('John',58);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Chris',43);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Chris',38);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris',87);
Query OK, 1 row affected (0.14 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+-------+
| Name | Score |
+-------+-------+
| John | 56 |
| John | 45 |
| John | 58 |
| Chris | 43 |
| Chris | 38 |
| Chris | 87 |
+-------+-------+
6 rows in set (0.00 sec)
4. 여러 개의 최소값을 조회하는 쿼리
핵심은 상관 서브쿼리(correlated subquery)입니다. 외부 쿼리의 각 행과 내부 쿼리의 이름(Name)을 비교하여, 같은 이름을 가진 행들 중에서 가장 낮은 점수만 필터링하는 방식입니다.
mysql> select *from DemoTable tbl1
-> where Score IN( select min(Score) from DemoTable tbl2 where tbl1.Name=tbl2.Name);
5. 실행 결과 확인
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+-------+-------+
| Name | Score |
+-------+-------+
| John | 45 |
| Chris | 38 |
+-------+-------+
2 rows in set (0.00 sec)
결과를 보면 John의 최저 점수인 45점과 Chris의 최저 점수인 38점이 한 번의 쿼리로 함께 조회된 것을 확인할 수 있습니다. 이처럼 서브쿼리 안에서 tbl1.Name = tbl2.Name 조건으로 그룹을 묶어주면, GROUP BY 없이도 각 그룹별 최소값을 손쉽게 추출할 수 있습니다.