MySQL에서 특정 열의 최댓값(MAX) 또는 최솟값(MIN)을 구할 때, 해당 값이 속한 행의 ID까지 함께 확인해야 하는 경우가 종종 있습니다. 이럴 때는 집계 함수인 MAX()와 MIN()을 서브쿼리와 함께 사용하면 간단하게 해결할 수 있습니다.
테이블 생성하기
먼저 예제에 사용할 테이블을 생성하겠습니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number1 int,
Number2 int
);
Query OK, 0 rows affected (0.89 sec)
레코드 삽입하기
INSERT 명령어를 사용해 테이블에 데이터를 추가합니다.
mysql> insert into DemoTable(Number1,Number2) values(67,45);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(Number1,Number2) values(90,40);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(Number1,Number2) values(80,43);
Query OK, 1 row affected (0.48 sec)
전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable ;
실행 결과는 다음과 같습니다.
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 1 | 67 | 45 |
| 2 | 90 | 40 |
| 3 | 80 | 43 |
+----+---------+---------+
3 rows in set (0.00 sec)
행 ID와 함께 MAX 및 MIN 값 조회하기
다음은 Number1의 최댓값 또는 Number2의 최솟값에 해당하는 행을 ID와 함께 조회하는 쿼리입니다.
mysql> select * from DemoTable
where Number1 = (select max(Number1) from DemoTable)
or Number2 = (select min(Number2) from DemoTable);
실행 결과는 다음과 같습니다.
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 2 | 90 | 40 |
+----+---------+---------+
1 row in set (0.00 sec)
쿼리 설명: 위 쿼리는 서브쿼리를 통해 테이블 전체에서 Number1의 최댓값과 Number2의 최솟값을 먼저 계산한 뒤, 그 값과 일치하는 행만 WHERE 절로 필터링하여 반환합니다. 실행 결과를 보면 Number1이 90으로 가장 크고, 동시에 Number2가 40으로 가장 작은 Id 2번 행이 정확히 조회된 것을 확인할 수 있습니다. 이처럼 집계 함수와 서브쿼리를 조합하면 최댓값·최솟값뿐 아니라 해당 행의 다른 컬럼 정보까지 한 번에 가져올 수 있습니다.