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

MySQL에서 여러 그룹의 최소값을 한 번에 조회하는 쿼리 작성법

여러 행(그룹)에 대해 각각의 최소값을 동시에 조회하려면 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 없이도 각 그룹별 최소값을 손쉽게 추출할 수 있습니다.