MySQL MAX 함수 설명: 구문, 예제, GROUP BY 및 성능 최적화

目次

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_idMAX(salary)
1120000
290000
380000

이 결과는 각 부서(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_monthMAX(amount)
2025-0150000
2025-0270000
2025-0360000

이 쿼리에서는 sale_date 열을 연-월(%Y-%m) 형식으로 변환하고, 각 월별 최대 매출액을 가져옵니다.

GROUP BY 사용 시 중요한 참고 사항

  1. SELECT 절에 포함되는 열에 대한 제한 GROUP BY 절을 사용할 때, SELECT 절에 포함되는 열은 다음 중 하나여야 합니다:
  • GROUP BY 절에 지정된 열
  • 집계 함수(예: MAX, SUM, COUNT 등) 예: 다음 쿼리는 오류를 발생시킵니다.
    SELECT department_id, salary
    FROM employees
    GROUP BY department_id;
    

이유: salary가 집계 함수에 포함되지 않았으며 GROUP BY 절에도 포함되지 않았습니다.

  1. NULL 값 처리 그룹화 열에 NULL 값이 포함되어 있으면, 해당 NULL 값은 별도의 그룹으로 취급됩니다. 예: 부서 ID가 NULL인 레코드도 하나의 그룹으로 계산됩니다.
  2. 성능 최적화 대량의 데이터를 그룹화할 때 인덱스를 사용하면 쿼리 성능을 향상시킬 수 있습니다. 필요에 따라 인덱스를 추가하십시오.

5. 최대값을 가진 전체 레코드 가져오기

MySQL의 MAX 함수를 사용하면 특정 열의 최대값을 가져올 수 있습니다. 하지만 이 함수는 그 최대값을 포함하는 전체 레코드를 자동으로 반환하지는 않습니다. 실제 데이터 분석 및 애플리케이션에서는 최대값 자체뿐만 아니라 다른 열의 관련 정보도 필요할 때가 많습니다.

이 섹션에서는 최대값을 포함하는 전체 레코드를 가져오는 방법을 자세히 설명합니다.

방법 1: 서브쿼리 사용

특정 열의 최대값을 포함하는 레코드를 가져오기 위해 서브쿼리를 사용할 수 있습니다.

예시: 가장 높은 급여를 받는 직원 정보 가져오기

SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

출력 예시:

employee_idnamesalarydepartment_id
101Tanaka1200001

이 쿼리의 작동 방식:

  1. 서브쿼리 (SELECT MAX(salary) FROM employees)는 가장 높은 급여를 가져옵니다.
  2. 외부 쿼리는 해당 최고 급여와 일치하는 전체 레코드를 가져옵니다.

방법 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_idnamesalarydepartment_id
101Tanaka1200001
202Suzuki900002

이 쿼리의 작동 방식:

  1. 서브쿼리는 각 부서별 최고 급여를 계산합니다.
  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_idnamesalarydepartment_id
101Tanaka1200001
202Suzuki900002

이 쿼리의 작동 방식:

  1. RANK() 함수는 각 부서 내 급여를 내림차순으로 순위 매깁니다.
  2. 외부 쿼리는 순위가 1인 레코드(최대값을 가진 레코드)를 추출합니다.

중요한 참고 사항

  1. 최대값을 공유하는 레코드가 여러 개일 경우
  • 여러 레코드가 동일한 최대값을 공유하면, 어느 방법을 사용하든 일치하는 모든 레코드가 반환됩니다. 예시:
    SELECT *
    FROM employees
    WHERE salary = (SELECT MAX(salary) FROM employees);
    

출력 예시:

employee_idnamesalarydepartment_id
101Tanaka1200001
102Sato1200001
  1. 성능 최적화
  • 대규모 데이터셋에서 서브쿼리나 JOIN을 사용하면 성능이 저하될 수 있습니다.
  • 적절한 인덱싱은 쿼리 실행 속도를 크게 향상시킬 수 있습니다.

실무 비즈니스 예시

  1. 가장 높은 가격을 가진 제품 조회
    SELECT *
    FROM products
    WHERE price = (SELECT MAX(price) FROM products);
    
  1. 프로젝트별 최대 비용에 대한 상세 정보 조회
    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_idnamesalary
1Tanaka50000
2SatoNULL
3Suzuki60000

출력:

MAX(salary)
60000

핵심 포인트:

  • salary 컬럼에 NULL 값이 포함되어 있어도, MAX 함수는 계산 시 이를 무시합니다.
  • NULL 값이 데이터 로직에 어떤 영향을 미치는지 신중히 고려해야 합니다.

최대값이 여러 개 존재할 때

MAX 함수는 단일 최대값을 반환하지만, 데이터셋에서 동일한 최대값을 가진 레코드가 여러 개 존재할 수 있습니다. 이러한 경우, 모든 일치하는 레코드를 조회하도록 쿼리를 구성해야 합니다.

예시: 동일한 최대 급여를 가진 직원 조회

SELECT * 
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

데이터:

employee_idnamesalary
1Tanaka60000
2Sato60000
3Suzuki50000

출력:

employee_idnamesalary
1Tanaka60000
2Sato60000

핵심 포인트:

  • MAX만으로 충분하지 않을 경우, 서브쿼리를 사용하여 모든 일치 레코드를 조회합니다.

성능 영향

MAX 함수는 단순 쿼리에서는 효율적으로 동작합니다. 그러나 대규모 데이터셋이나 복잡한 쿼리를 다룰 때는 성능이 저하될 수 있습니다.

성능 향상을 위한 팁

  1. 인덱스 사용 MAX 함수에 사용되는 컬럼에 인덱스를 추가하면 쿼리 속도를 크게 향상시킬 수 있습니다.
    CREATE INDEX idx_salary ON employees(salary);
    
  1. 불필요한 데이터 필터링 WHERE 절을 사용해 대상 행을 제한함으로써 데이터셋을 축소합니다.
    SELECT MAX(salary)
    FROM employees
    WHERE department_id = 1;
    
  1. 분할 및 계산 데이터셋을 부분으로 나누어 최대값을 계산한 뒤 최종 최대값을 결정하는 방식을 고려합니다.

기타 고려 사항

  1. 데이터 타입의 영향 MAX 함수의 동작은 컬럼의 데이터 타입에 따라 달라집니다.
  • 숫자형: 단순한 수치 비교.
  • 문자열형: 사전식(lexicographical) 순서로 비교.
  • 날짜형: 가장 최신(최근) 날짜를 반환합니다. 예시:
    SELECT MAX(last_name) FROM employees;
    

이 경우, 최대값은 문자열의 사전식 순서에 따라 결정됩니다.

  1. NULL이 아닌 누락 데이터 데이터가 불완전하거나 형식이 잘못된 경우, 계산 결과가 기대와 다를 수 있습니다. 데이터 정제가 필요할 수 있습니다.

  2. 다른 집계 함수와 결합 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_idnamesalary
1Tanaka60000
2SatoNULL
3Suzuki50000

결과:

MAX(salary)
60000

Important Note:
처리 과정에 NULL 값을 포함하려면 IFNULL 함수를 사용하여 NULL을 기본값으로 대체하세요.

SELECT MAX(IFNULL(salary, 0)) FROM employees;

Q5: MAX 함수를 사용할 때 성능을 어떻게 향상시킬 수 있나요?

A5: 다음과 같은 방법을 고려해 보세요:

  1. 인덱스 추가: MAX 함수에 사용되는 열에 인덱스를 추가하면 쿼리 성능이 크게 향상될 수 있습니다.
    CREATE INDEX idx_salary ON employees(salary);
    
  1. 대상 데이터 필터링: WHERE 절을 사용하여 처리되는 행 수를 줄입니다.
    SELECT MAX(salary) FROM employees WHERE department_id = 1;
    
  1. 쿼리 최적화: 불필요한 계산을 제거하고 쿼리 구조를 단순하게 유지합니다.

Q6: MAX와 GROUP BY 절을 결합하면 어떻게 되나요?

A6: GROUP BY와 MAX 함수를 결합하면 각 그룹별 최대값을 가져올 수 있습니다.

예시: 부서별 최고 급여 가져오기

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;

결과:

department_idMAX(salary)
1120000
290000

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 함수의 기본 사용법부터 조건부 쿼리, 그룹화, 최대값을 가진 전체 레코드 조회, 성능 최적화에 이르기까지 포괄적으로 다루었습니다.

주요 요점

  1. MAX 함수의 기본 사용법 MAX 함수는 지정된 열의 최대값을 가져오는 데 사용됩니다. 숫자, 문자열, 날짜 등 다양한 데이터 유형을 지원합니다.
  2. 조건부 최대값 조회 WHERE 절을 사용하면 특정 조건에 맞는 최대값을 조회할 수 있습니다. 이는 프로젝트 기반 또는 부서 기반 분석에 유용합니다.
  3. 그룹별 최대값 조회 GROUP BY 절을 사용하여 부서별 급여나 월별 매출과 같이 각 그룹의 최대값을 조회하는 방법을 설명했습니다.
  4. 최대값을 포함한 전체 레코드 조회 서브쿼리, JOIN, 윈도우 함수를 사용하여 최대값을 포함한 전체 레코드를 효율적으로 조회하는 방법을 배웠습니다.
  5. MAX 사용 시 중요한 고려사항 NULL 처리, 다중 최대값, 성능 영향을 고려하는 것이 중요합니다.
  6. FAQ 다중 열에 대한 MAX 사용 방법 및 성능 최적화 팁 등 일반적인 질문에 답변했습니다.

최종 생각

MAX 함수를 적절히 활용하면 데이터 분석 및 보고가 훨씬 효율적이 됩니다. 더 고급 쿼리를 만들기 위해 SQL 연습을 계속하세요.

We hope this article helps deepen your understanding of data manipulation and analysis using MySQL.