본문 바로가기
프로그래밍/MySQL

📊 [SQL 프로젝트] 제20장 GROUP BY와 MIN/MAX - 가장 큰 값과 가장 작은 값 찾기

by 강릉바다의 블로그 2026. 7. 2.

제20장 GROUP BY와 MIN/MAX - 가장 큰 값과 가장 작은 값 찾기


📚 집계 함수 활용 시리즈

① COUNT
② SUM
③ AVG
④ MIN / MAX   ← 현재
⑤ 여러 집계 함수를 함께 사용하기

지금까지는

  • 개수(COUNT)
  • 합계(SUM)
  • 평균(AVG)

을 계산했습니다.

이번 장에서는

가장 큰 값(MAX)

가장 작은 값(MIN) 을 찾는 방법을 배워 보겠습니다.


오늘의 질문

상품관리팀에서 다음과 같이 질문했습니다.

"가장 비싼 상품은 얼마인가요?"

 

잠시 후 다른 직원이 묻습니다.

"가장 저렴한 상품은 얼마인가요?"

 

이번에는

평균도,

합계도 아닙니다.

가장 큰 값

또는

가장 작은 값

을 찾아야 합니다.

이때 사용하는 함수가

MAX()와 MIN()입니다.


학습 목표

이번 장을 학습하면 다음 내용을 할 수 있습니다.

  • MAX() 함수의 역할을 설명할 수 있다.
  • MIN() 함수의 역할을 설명할 수 있다.
  • GROUP BY와 함께 사용할 수 있다.
  • 실무에서 최고값과 최저값을 찾을 수 있다.

20-1. MAX()와 MIN()이란 무엇일까요?

다음과 같은 가격이 있습니다.

상품 가격
A 18
B 42
C 27
D 15

이때

MAX()
↓
42

가 됩니다.

반대로

MIN()
↓
15

가 됩니다.

즉,

MAX는

가장 큰 값을,

MIN은

가장 작은 값을 반환합니다.


먼저 실행해 봅시다.

SELECT MAX(Price)
FROM Products;

실행 결과(예)

MAX(Price)
263.50

Products 테이블에서

가장 비싼 상품 가격을 찾았습니다.


이번에는

SELECT MIN(Price)
FROM Products;

실행 결과(예)

MIN(Price)
2.50

가장 저렴한 상품 가격입니다.


잠깐 생각해 보기

지금까지 배운 집계 함수를 비교해 보면

함수 의미
COUNT() 개수
SUM() 합계
AVG() 평균
MAX() 최고값
MIN() 최저값

학생들은

이 다섯 개를 하나의 묶음으로 기억하면 됩니다.


20-2. GROUP BY와 함께 사용하기

이번에는

카테고리별 최고 가격을 계산해 보겠습니다.

SELECT CategoryID,
       MAX(Price) AS HighestPrice
FROM Products
GROUP BY CategoryID;

실행 결과(예)

CategoryID HighestPrice
1 81.00
2 43.90
3 97.00
... ...

각 카테고리에서

가장 비싼 상품 가격을 계산했습니다.


이번에는

최저 가격입니다.

SELECT CategoryID,
       MIN(Price) AS LowestPrice
FROM Products
GROUP BY CategoryID;

각 카테고리의

가장 저렴한 상품 가격이 출력됩니다.


SQL을 한 줄씩 읽어 보기

SELECT CategoryID,
       MAX(Price) AS HighestPrice
FROM Products
GROUP BY CategoryID;
SELECT CategoryID

카테고리를 출력합니다.

MAX(Price)

가장 비싼 가격을 찾습니다.

FROM Products

Products 테이블에서 데이터를 가져옵니다.

GROUP BY CategoryID

카테고리별로 묶습니다.

즉,

카테고리별 최고 가격을 계산하라.

라는 의미입니다.


20-3. HAVING과 함께 사용하기

최고 가격이

100달러 이상인 카테고리만 출력해 보겠습니다.

SELECT CategoryID,
       MAX(Price) AS HighestPrice
FROM Products
GROUP BY CategoryID
HAVING MAX(Price) >= 100;

이번에는

최저 가격이

10달러 이하인 카테고리도 찾을 수 있습니다.

SELECT CategoryID,
       MIN(Price) AS LowestPrice
FROM Products
GROUP BY CategoryID
HAVING MIN(Price) <= 10;

20-4. ORDER BY와 함께 사용하기

SELECT CategoryID,
       MAX(Price) AS HighestPrice
FROM Products
GROUP BY CategoryID
ORDER BY HighestPrice DESC;

가장 비싼 상품이 있는 카테고리부터 출력됩니다.

실무에서는

GROUP BY

MAX()

ORDER BY

조합도 자주 사용합니다.


💡 잠깐! 이것도 알아두세요

MAX()와 MIN()은

가격뿐 아니라

다양한 데이터에서 사용할 수 있습니다.

예를 들면

  • 최고 점수
  • 최저 점수
  • 가장 빠른 주문일
  • 가장 늦은 주문일
  • 가장 큰 수량

등입니다.

특히

날짜(Date)도 비교할 수 있다는 점을 기억해 두세요.


자주 하는 실수

① MAX()가 가장 비싼 상품 이름도 함께 가져온다고 생각한다.

SELECT MAX(Price)
FROM Products;

이 SQL은

가격만 알려 줍니다.

상품 이름은 출력하지 않습니다.

상품 이름까지 알고 싶다면

다음에 배울 JOIN이나 서브쿼리가 필요할 수도 있습니다.


② MAX()와 ORDER BY를 같은 기능이라고 생각한다.

MAX()

가장 큰 값 하나를 찾습니다.

ORDER BY DESC

큰 값부터 모두 정렬합니다.

둘은 전혀 다른 기능입니다.


③ GROUP BY를 빼먹는다.

카테고리별 최고 가격을 계산하려면

반드시

GROUP BY CategoryID;

가 필요합니다.


④ HAVING 대신 WHERE를 사용한다.

집계 함수는

HAVING에서 조건을 지정합니다.


실무에서는 어떻게 사용할까요?

회사에서는

MAX()와 MIN()을 이용하여

  • 최고 판매 상품
  • 최저 판매 상품
  • 가장 오래된 주문
  • 가장 최근 주문
  • 최고 점수
  • 최저 점수

등을 자주 분석합니다.

특히

날짜 데이터와 함께 사용하는 경우가 매우 많습니다.


실습

실습 1

Products 테이블에서

가장 비싼 상품 가격을 조회하세요.

SELECT MAX(Price)
FROM Products;

실습 2

가장 저렴한 상품 가격을 조회하세요.

SELECT MIN(Price)
FROM Products;

실습 3

카테고리별 최고 가격을 조회하세요.

SELECT CategoryID,
       MAX(Price)
FROM Products
GROUP BY CategoryID;

실무 미션

당신은 상품관리팀 직원입니다.

팀장님이

"카테고리별 최고 가격과 최저 가격을 한 번에 보고 싶습니다."

라고 요청했습니다.

다음 항목을 출력하세요.

  • CategoryID
  • 최고 가격
  • 최저 가격

힌트)

MAX()와 MIN()을 함께 사용할 수 있습니다.


핵심 정리

✔ MAX()는 가장 큰 값을 찾는 집계 함수이다.

✔ MIN()은 가장 작은 값을 찾는 집계 함수이다.

✔ GROUP BY와 함께 사용하면 그룹별 최고값과 최저값을 계산할 수 있다.

✔ 날짜(Date) 데이터에도 사용할 수 있다.

 

대부분의 교재는 집계 함수를 각각 설명하고 끝나지만, 실제 업무에서는 다음과 같이 여러 집계 함수를 동시에 사용합니다.

SELECT CategoryID,
       COUNT(*) AS ProductCount,
       SUM(Price) AS TotalPrice,
       AVG(Price) AS AveragePrice,
       MAX(Price) AS HighestPrice,
       MIN(Price) AS LowestPrice
FROM Products
GROUP BY CategoryID;

이 SQL 하나에는 지금까지 배운 다섯 가지 집계 함수와 GROUP BY가 모두 담겨 있습니다.


연습 문제

기본 문제

  1. MAX() 함수의 역할을 설명하세요.
  2. MIN() 함수의 역할을 설명하세요.
  3. MAX()와 ORDER BY DESC의 차이를 설명하세요.

응용 문제

  1. Products 테이블에서 CategoryID별 최고 가격을 구하는 SQL을 작성하세요.
  2. CategoryID별 최저 가격을 구하는 SQL을 작성하세요.
  3. 최고 가격이 80 이상인 카테고리만 출력하는 SQL을 작성하세요.

도전 문제

Products 테이블에서

카테고리별로

  • 상품 개수
  • 가격 합계
  • 평균 가격
  • 최고 가격
  • 최저 가격

한 번의 SQL로 출력해 보세요.


다음 장 예고

지금까지 우리는

  • COUNT()
  • SUM()
  • AVG()
  • MAX()
  • MIN()

다섯 가지 집계 함수를 각각 살펴보았습니다.

하지만 실제 업무에서는 이 함수들을 하나씩 따로 사용하는 경우보다, 여러 개를 함께 사용하는 경우가 훨씬 많습니다.

예를 들어 팀장님은 다음과 같이 요청할 수 있습니다.

"카테고리별 상품 수와 평균 가격, 최고 가격, 최저 가격을 한 번에 보여 주세요."

 

다음 장에서는 여러 집계 함수를 조합하여 하나의 통계 보고서를 만드는 방법을 배우겠습니다.