MySQL에서 특정 열의 가장 낮은 값을 구할 때는 MIN() 함수를, 가장 높은 값을 구할 때는 MAX() 함수를 사용합니다. 이 두 집계 함수를 서브쿼리와 결합하면 최솟값이나 최댓값을 가진 전체 행 데이터를 손쉽게 조회할 수 있습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
CustomerName varchar(20),
ProductAmount int
) ;
Query OK, 0 rows affected (1.03 sec)2. 샘플 데이터 삽입
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values('Chris',3599);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('David',7843);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Mike',97474);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('Bob',65884);
Query OK, 1 row affected (0.19 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------------+---------------+ | CustomerName | ProductAmount | +--------------+---------------+ | Chris | 3599 | | David | 7843 | | Mike | 97474 | | Bob | 65884 | +--------------+---------------+ 4 rows in set (0.00 sec)
4. 최솟값과 최댓값에 해당하는 행 조회
다음은 MAX()와 MIN()을 서브쿼리로 활용하여 최댓값 또는 최솟값을 가진 행을 가져오는 쿼리입니다.
mysql> select *from DemoTable where ProductAmount=(select max(ProductAmount) from DemoTable)
or ProductAmount=(select min(ProductAmount) from DemoTable);실행 결과는 다음과 같습니다.
+--------------+---------------+ | CustomerName | ProductAmount | +--------------+---------------+ | Chris | 3599 | | Mike | 97474 | +--------------+---------------+ 2 rows in set (0.00 sec)
쿼리 동작 방식 설명
이 쿼리는 두 개의 서브쿼리를 사용합니다. 첫 번째 서브쿼리인 (select max(ProductAmount) from DemoTable)은 테이블 내 ProductAmount 열의 최댓값(97474)을 반환하고, 두 번째 서브쿼리인 (select min(ProductAmount) from DemoTable)은 최솟값(3599)을 반환합니다. WHERE 절의 OR 조건을 통해 이 두 값 중 하나와 일치하는 행만 최종 결과로 출력됩니다.
참고 사항
만약 최솟값과 최댓값이 각각 여러 행에 존재한다면(예: 동일한 금액을 가진 고객이 여러 명인 경우), 해당하는 모든 행이 함께 조회됩니다. 또한 MySQL 8.0 이상에서는 윈도우 함수를 사용해 성능을 개선할 수도 있지만, 소규모 테이블에서는 위 방식이 가장 직관적이고 널리 사용됩니다.