- 1 1. Introduction
- 2 2. Basic Usage of the MAX Function
- 3 3. Retrieving the Maximum Value with Conditions
- 4 4. How to Retrieve the Maximum Value for Each Group
- 5 5. 최대값을 가진 전체 레코드 가져오기
- 6 6. MAX 함수 사용 시 중요한 고려 사항
- 7 7. FAQ: 자주 묻는 질문
- 7.1 Q1: MAX 함수를 동시에 여러 컬럼에 사용할 수 있나요?
- 7.2 Q2: MAX 함수를 문자열 열에 적용하면 어떻게 되나요?
- 7.3 Q3: MAX 함수와 ORDER BY 절의 차이점은 무엇인가요?
- 7.4 Q4: NULL 값이 포함된 경우에도 MAX 함수가 올바르게 작동하나요?
- 7.5 Q5: MAX 함수를 사용할 때 성능을 어떻게 향상시킬 수 있나요?
- 7.6 Q6: MAX와 GROUP BY 절을 결합하면 어떻게 되나요?
- 7.7 Q7: 여러 레코드가 동일한 최대값을 공유하는 경우, 모두 어떻게 가져올 수 있나요?
- 7.8 Q8: MAX 함수를 윈도우 함수와 함께 사용할 수 있나요?
- 8 8. 요약
1. Introduction
MySQL은 전 세계적으로 널리 사용되는 데이터베이스 관리 시스템입니다. 다양한 기능 중 MAX 함수는 데이터 분석 및 보고서 생성에 자주 사용되는 중요한 집계 함수입니다. 이 함수를 사용하면 지정된 열의 최대값을 손쉽게 조회할 수 있습니다.
이 문서는 MySQL MAX 함수의 기본 사용법부터 고급 예제 및 중요한 고려 사항까지 모두 명확히 설명합니다. 초보자와 중급 사용자 모두에게 도움이 되도록 설계되었으니 참고 자료로 활용하시기 바랍니다.
2. Basic Usage of the MAX Function
MAX 함수는 숫자값, 날짜, 문자열 등 다양한 데이터 타입에 사용할 수 있습니다. 이 섹션에서는 기본 사용법을 자세히 설명합니다.
Syntax of the MAX Function
아래는 MAX 함수의 기본 구문입니다.
SELECT MAX(column_name) FROM table_name;
이 구문을 사용하면 지정된 열의 최대값을 조회할 수 있습니다.
Example: Using MAX with a Numeric Column
다음 예제는 employees 테이블에서 가장 높은 급여를 조회합니다.
SELECT MAX(salary) FROM employees;
Output Example:
| MAX(salary) |
|---|
| 120000 |
이 결과는 salary 열의 최대값이 120000임을 나타냅니다.
Example: Using MAX with a Date Column
직원들의 가장 최근 입사일을 조회하려면 다음 쿼리를 사용합니다.
SELECT MAX(hire_date) FROM employees;
Output Example:
| MAX(hire_date) |
|---|
| 2025-01-01 |
이 결과는 가장 최근 입사일이 2025-01-01임을 보여줍니다.
Example: Using MAX with a String Column
MAX 함수는 문자열 열에도 사용할 수 있습니다. 문자열의 경우 사전식(lexicographical) 순서에서 마지막에 나타나는 값을 반환합니다.
SELECT MAX(last_name) FROM employees;
Output Example:
| MAX(last_name) |
|---|
| Yamamoto |
이 결과는 알파벳 순서(사전식)에서 마지막에 나타나는 이름이 Yamamoto임을 나타냅니다.
3. Retrieving the Maximum Value with Conditions
MAX 함수는 조건과 함께 사용할 수도 있습니다. 이 섹션에서는 특정 조건 하에서 최대값을 조회하는 방법을 설명합니다.
Combining with the WHERE Clause
특정 조건을 적용하여 최대값을 조회하려면 WHERE 절을 사용합니다.
예시: 부서 ID가 10인 직원 중 가장 높은 급여를 조회
SELECT MAX(salary) FROM employees WHERE department_id = 10;
Output Example:
| MAX(salary) |
|---|
| 90000 |
이 쿼리는 부서 ID가 10인 직원 중 최대 급여를 조회합니다.
Practical Business Example
동일한 구문을 사용하여 특정 프로젝트와 관련된 최대 비용을 조회할 수 있습니다.
SELECT MAX(cost) FROM projects WHERE project_status = 'active';
이 쿼리는 상태가 active인 프로젝트 중 최대 비용을 조회합니다.
4. How to Retrieve the Maximum Value for Each Group
MySQL의 GROUP BY 절을 사용하면 각 그룹별 최대값을 조회할 수 있습니다. 예를 들어 부서별 최고 급여나 월별 최대 매출을 분석할 때 매우 유용합니다. 이 섹션에서는 그룹별 최대값을 조회하는 방법을 자세히 설명합니다.
Basic Syntax
각 그룹별 최대값을 조회하려면 다음과 같이 쿼리를 작성합니다.
SELECT grouping_column, MAX(target_column)
FROM table_name
GROUP BY grouping_column;
이 구문을 사용하면 MySQL이 지정된 열을 기준으로 데이터를 그룹화하고 각 그룹 내에서 최대값을 반환합니다.
Example: Retrieve the Highest Salary per Department
다음 쿼리는 employees 테이블에서 부서별 최고 급여를 조회합니다.
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
Output Example:
| department_id | MAX(salary) |
|---|---|
| 1 | 120000 |
| 2 | 90000 |
| 3 | 80000 |
이 결과는 각 부서(department_id)에 대한 최대 급여(MAX(salary))를 보여줍니다.
Example: Retrieve the Maximum Sales per Month
판매 테이블에서 각 월별 최대 매출액을 가져오려면, 다음과 같이 쿼리를 작성하십시오:
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS sale_month, MAX(amount)
FROM sales
GROUP BY sale_month;
출력 예시:
| sale_month | MAX(amount) |
|---|---|
| 2025-01 | 50000 |
| 2025-02 | 70000 |
| 2025-03 | 60000 |
이 쿼리에서는 sale_date 열을 연-월(%Y-%m) 형식으로 변환하고, 각 월별 최대 매출액을 가져옵니다.
GROUP BY 사용 시 중요한 참고 사항
- SELECT 절에 포함되는 열에 대한 제한
GROUP BY절을 사용할 때, SELECT 절에 포함되는 열은 다음 중 하나여야 합니다:
GROUP BY절에 지정된 열- 집계 함수(예: MAX, SUM, COUNT 등) 예: 다음 쿼리는 오류를 발생시킵니다.
SELECT department_id, salary FROM employees GROUP BY department_id;
이유: salary가 집계 함수에 포함되지 않았으며 GROUP BY 절에도 포함되지 않았습니다.
- NULL 값 처리 그룹화 열에 NULL 값이 포함되어 있으면, 해당 NULL 값은 별도의 그룹으로 취급됩니다. 예: 부서 ID가 NULL인 레코드도 하나의 그룹으로 계산됩니다.
- 성능 최적화 대량의 데이터를 그룹화할 때 인덱스를 사용하면 쿼리 성능을 향상시킬 수 있습니다. 필요에 따라 인덱스를 추가하십시오.
5. 최대값을 가진 전체 레코드 가져오기
MySQL의 MAX 함수를 사용하면 특정 열의 최대값을 가져올 수 있습니다. 하지만 이 함수는 그 최대값을 포함하는 전체 레코드를 자동으로 반환하지는 않습니다. 실제 데이터 분석 및 애플리케이션에서는 최대값 자체뿐만 아니라 다른 열의 관련 정보도 필요할 때가 많습니다.
이 섹션에서는 최대값을 포함하는 전체 레코드를 가져오는 방법을 자세히 설명합니다.
방법 1: 서브쿼리 사용
특정 열의 최대값을 포함하는 레코드를 가져오기 위해 서브쿼리를 사용할 수 있습니다.
예시: 가장 높은 급여를 받는 직원 정보 가져오기
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
출력 예시:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
이 쿼리의 작동 방식:
- 서브쿼리
(SELECT MAX(salary) FROM employees)는 가장 높은 급여를 가져옵니다. - 외부 쿼리는 해당 최고 급여와 일치하는 전체 레코드를 가져옵니다.
방법 2: JOIN 사용
JOIN을 사용하면 보다 유연한 쿼리를 만들 수 있습니다.
예시: 부서별 최고 급여를 받는 직원 가져오기
SELECT e.*
FROM employees e
JOIN (
SELECT department_id, MAX(salary) AS max_salary
FROM employees
GROUP BY department_id
) subquery
ON e.department_id = subquery.department_id
AND e.salary = subquery.max_salary;
출력 예시:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 202 | Suzuki | 90000 | 2 |
이 쿼리의 작동 방식:
- 서브쿼리는 각 부서별 최고 급여를 계산합니다.
- 메인 쿼리는 해당 최고 급여와 일치하는 전체 직원 레코드를 가져옵니다.
방법 3: 윈도우 함수 사용 (MySQL 8.0+)
MySQL 8.0 이상에서는 윈도우 함수를 사용하여 최대값을 가진 레코드를 보다 간결하고 효율적으로 가져올 수 있습니다.
예시: 부서별 최고 급여를 받는 직원 가져오기
SELECT employee_id, name, salary, department_id
FROM (
SELECT *,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk = 1;
출력 예시:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 202 | Suzuki | 90000 | 2 |
이 쿼리의 작동 방식:
RANK()함수는 각 부서 내 급여를 내림차순으로 순위 매깁니다.- 외부 쿼리는 순위가 1인 레코드(최대값을 가진 레코드)를 추출합니다.
중요한 참고 사항
- 최대값을 공유하는 레코드가 여러 개일 경우
- 여러 레코드가 동일한 최대값을 공유하면, 어느 방법을 사용하든 일치하는 모든 레코드가 반환됩니다. 예시:
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
출력 예시:
| employee_id | name | salary | department_id |
|---|---|---|---|
| 101 | Tanaka | 120000 | 1 |
| 102 | Sato | 120000 | 1 |
- 성능 최적화
- 대규모 데이터셋에서 서브쿼리나 JOIN을 사용하면 성능이 저하될 수 있습니다.
- 적절한 인덱싱은 쿼리 실행 속도를 크게 향상시킬 수 있습니다.
실무 비즈니스 예시
- 가장 높은 가격을 가진 제품 조회
SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);
- 프로젝트별 최대 비용에 대한 상세 정보 조회
SELECT p.* FROM projects p JOIN ( SELECT project_id, MAX(cost) AS max_cost FROM project_costs GROUP BY project_id ) subquery ON p.project_id = subquery.project_id AND p.cost = subquery.max_cost;
6. MAX 함수 사용 시 중요한 고려 사항
MySQL MAX 함수는 매우 유용한 집계 함수이지만, 사용 시 염두에 두어야 할 중요한 점이 몇 가지 있습니다. 데이터 특성, 성능 영향, NULL 값 처리 방식을 이해하면 잘못된 결과와 성능 저하를 방지할 수 있습니다. 이 섹션에서는 MAX 함수를 사용할 때 고려해야 할 핵심 사항을 설명합니다.
NULL 값 처리
MySQL에서 NULL 값은 “알 수 없는 값”으로 취급됩니다. 따라서 MAX 함수를 사용할 때 NULL 값은 무시됩니다.
예시: NULL을 포함한 데이터에서 최대값 조회
SELECT MAX(salary) FROM employees;
데이터:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 50000 |
| 2 | Sato | NULL |
| 3 | Suzuki | 60000 |
출력:
| MAX(salary) |
|---|
| 60000 |
핵심 포인트:
salary컬럼에 NULL 값이 포함되어 있어도, MAX 함수는 계산 시 이를 무시합니다.- NULL 값이 데이터 로직에 어떤 영향을 미치는지 신중히 고려해야 합니다.
최대값이 여러 개 존재할 때
MAX 함수는 단일 최대값을 반환하지만, 데이터셋에서 동일한 최대값을 가진 레코드가 여러 개 존재할 수 있습니다. 이러한 경우, 모든 일치하는 레코드를 조회하도록 쿼리를 구성해야 합니다.
예시: 동일한 최대 급여를 가진 직원 조회
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
데이터:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | 60000 |
| 3 | Suzuki | 50000 |
출력:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | 60000 |
핵심 포인트:
- MAX만으로 충분하지 않을 경우, 서브쿼리를 사용하여 모든 일치 레코드를 조회합니다.
성능 영향
MAX 함수는 단순 쿼리에서는 효율적으로 동작합니다. 그러나 대규모 데이터셋이나 복잡한 쿼리를 다룰 때는 성능이 저하될 수 있습니다.
성능 향상을 위한 팁
- 인덱스 사용 MAX 함수에 사용되는 컬럼에 인덱스를 추가하면 쿼리 속도를 크게 향상시킬 수 있습니다.
CREATE INDEX idx_salary ON employees(salary);
- 불필요한 데이터 필터링 WHERE 절을 사용해 대상 행을 제한함으로써 데이터셋을 축소합니다.
SELECT MAX(salary) FROM employees WHERE department_id = 1;
- 분할 및 계산 데이터셋을 부분으로 나누어 최대값을 계산한 뒤 최종 최대값을 결정하는 방식을 고려합니다.
기타 고려 사항
- 데이터 타입의 영향 MAX 함수의 동작은 컬럼의 데이터 타입에 따라 달라집니다.
- 숫자형: 단순한 수치 비교.
- 문자열형: 사전식(lexicographical) 순서로 비교.
- 날짜형: 가장 최신(최근) 날짜를 반환합니다. 예시:
SELECT MAX(last_name) FROM employees;
이 경우, 최대값은 문자열의 사전식 순서에 따라 결정됩니다.
NULL이 아닌 누락 데이터 데이터가 불완전하거나 형식이 잘못된 경우, 계산 결과가 기대와 다를 수 있습니다. 데이터 정제가 필요할 수 있습니다.
다른 집계 함수와 결합 MAX를 SUM이나 AVG와 같은 다른 집계 함수와 결합할 때는 결과를 올바르게 해석해야 합니다.
7. FAQ: 자주 묻는 질문
이 섹션에서는 MySQL MAX 함수에 대한 일반적인 질문들을 요약하고 설명합니다. 기본적인 내용부터 고급 주제까지 다룹니다.
Q1: MAX 함수를 동시에 여러 컬럼에 사용할 수 있나요?
A1: 아니요, MAX 함수는 단일 컬럼에 대해 작동합니다. 여러 컬럼의 최대값을 조회하려면 각 컬럼에 개별적으로 MAX 함수를 적용해야 합니다.
예시: 여러 열에서 최대값 가져오기
SELECT MAX(salary) AS max_salary, MAX(bonus) AS max_bonus
FROM employees;
Q2: MAX 함수를 문자열 열에 적용하면 어떻게 되나요?
A2: 문자열 열에 적용하면, MAX 함수는 사전 순(lexicographical)으로 마지막에 오는 값을 반환합니다.
예시: 최대 문자열 값 가져오기
SELECT MAX(last_name) FROM employees;
핵심 포인트:
- 사전 순서에서는 “Z”가 “A” 뒤에 오며, 숫자와 기호도 평가됩니다.
- 특수 문자가 포함되면 결과가 예상한 순서와 다를 수 있습니다.
Q3: MAX 함수와 ORDER BY 절의 차이점은 무엇인가요?
A3: MAX 함수와 ORDER BY 절은 비슷한 목적처럼 보일 수 있지만, 동작 방식은 다릅니다.
- MAX 함수: 지정된 열의 최대값을 직접 가져옵니다.
- ORDER BY 절: 지정된 열을 기준으로 데이터를 정렬하고 필요에 따라 첫 번째 또는 마지막 값을 가져올 수 있습니다.
예시: ORDER BY를 사용하여 최대값 가져오기
SELECT * FROM employees
ORDER BY salary DESC
LIMIT 1;
핵심 포인트:
- MAX 함수는 성능 면에서 더 효율적인 경우가 많습니다.
- ORDER BY 절은 최대값을 포함한 레코드와 함께 추가 정보를 필요로 할 때 유용합니다.
Q4: NULL 값이 포함된 경우에도 MAX 함수가 올바르게 작동하나요?
A4: 네, MAX 함수는 NULL 값을 무시합니다. 따라서 NULL 값은 최대값 계산에 영향을 주지 않습니다.
예시: NULL 값이 포함된 경우 동작
SELECT MAX(salary) FROM employees;
데이터:
| employee_id | name | salary |
|---|---|---|
| 1 | Tanaka | 60000 |
| 2 | Sato | NULL |
| 3 | Suzuki | 50000 |
결과:
| MAX(salary) |
|---|
| 60000 |
Important Note:
처리 과정에 NULL 값을 포함하려면 IFNULL 함수를 사용하여 NULL을 기본값으로 대체하세요.
SELECT MAX(IFNULL(salary, 0)) FROM employees;
Q5: MAX 함수를 사용할 때 성능을 어떻게 향상시킬 수 있나요?
A5: 다음과 같은 방법을 고려해 보세요:
- 인덱스 추가: MAX 함수에 사용되는 열에 인덱스를 추가하면 쿼리 성능이 크게 향상될 수 있습니다.
CREATE INDEX idx_salary ON employees(salary);
- 대상 데이터 필터링: WHERE 절을 사용하여 처리되는 행 수를 줄입니다.
SELECT MAX(salary) FROM employees WHERE department_id = 1;
- 쿼리 최적화: 불필요한 계산을 제거하고 쿼리 구조를 단순하게 유지합니다.
Q6: MAX와 GROUP BY 절을 결합하면 어떻게 되나요?
A6: GROUP BY와 MAX 함수를 결합하면 각 그룹별 최대값을 가져올 수 있습니다.
예시: 부서별 최고 급여 가져오기
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
결과:
| department_id | MAX(salary) |
|---|---|
| 1 | 120000 |
| 2 | 90000 |
Q7: 여러 레코드가 동일한 최대값을 공유하는 경우, 모두 어떻게 가져올 수 있나요?
A7: 서브쿼리나 JOIN을 사용하여 최대값을 공유하는 모든 레코드를 가져올 수 있습니다.
예시: 최대값을 가진 모든 레코드 가져오기
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
Q8: MAX 함수를 윈도우 함수와 함께 사용할 수 있나요?
A8: 네, MySQL 8.0 이상에서는 MAX 함수를 윈도우 함수와 결합하여 보다 유연한 쿼리를 작성할 수 있습니다.
예시: 부서별 최고 급여를 받는 직원 가져오기
SELECT employee_id, name, salary, department_id
FROM (
SELECT *,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk = 1;

8. 요약
MySQL MAX 함수는 데이터베이스 작업 및 데이터 분석을 위한 강력한 도구입니다. 이 글에서는 MAX 함수의 기본 사용법부터 조건부 쿼리, 그룹화, 최대값을 가진 전체 레코드 조회, 성능 최적화에 이르기까지 포괄적으로 다루었습니다.
주요 요점
- MAX 함수의 기본 사용법 MAX 함수는 지정된 열의 최대값을 가져오는 데 사용됩니다. 숫자, 문자열, 날짜 등 다양한 데이터 유형을 지원합니다.
- 조건부 최대값 조회
WHERE절을 사용하면 특정 조건에 맞는 최대값을 조회할 수 있습니다. 이는 프로젝트 기반 또는 부서 기반 분석에 유용합니다. - 그룹별 최대값 조회
GROUP BY절을 사용하여 부서별 급여나 월별 매출과 같이 각 그룹의 최대값을 조회하는 방법을 설명했습니다. - 최대값을 포함한 전체 레코드 조회 서브쿼리, JOIN, 윈도우 함수를 사용하여 최대값을 포함한 전체 레코드를 효율적으로 조회하는 방법을 배웠습니다.
- MAX 사용 시 중요한 고려사항 NULL 처리, 다중 최대값, 성능 영향을 고려하는 것이 중요합니다.
- FAQ 다중 열에 대한 MAX 사용 방법 및 성능 최적화 팁 등 일반적인 질문에 답변했습니다.
최종 생각
MAX 함수를 적절히 활용하면 데이터 분석 및 보고가 훨씬 효율적이 됩니다. 더 고급 쿼리를 만들기 위해 SQL 연습을 계속하세요.
We hope this article helps deepen your understanding of data manipulation and analysis using MySQL.


