본문 바로가기
IT/DB

MySQL GROUP_CONCAT 함수 최적화 및 활용 방법

by 불멸남생 2025. 3. 12.

MySQL의 GROUP_CONCAT 함수는 데이터를 그룹별로 문자열로 결합하는 강력한 기능을 제공합니다. 이 함수는 특히 여러 행의 데이터를 단일 행으로 변환하는 데 유용하며, 보고서 생성, 데이터 요약, JSON 또는 CSV 형식의 데이터 출력을 필요로 하는 다양한 상황에서 활용됩니다. 본 가이드는 GROUP_CONCAT의 개념부터 고급 활용법, 성능 최적화까지 상세히 설명하며, 구체적인 예제 코드와 함께 실전 적용 방안을 제공합니다.

1. MySQL GROUP_CONCAT 함수란?

1.1 GROUP_CONCAT 함수 개요

GROUP_CONCAT 함수는 특정 그룹의 데이터를 하나의 문자열로 결합하는 MySQL 집계(Aggregate) 함수입니다. 주로 GROUP BY 절과 함께 사용되며, 여러 개의 행을 하나의 행으로 변환할 때 유용합니다.
기본 문법:

SELECT GROUP_CONCAT(컬럼명 SEPARATOR '구분자')
FROM 테이블명
GROUP BY 그룹컬럼;
  • 컬럼명 : 결합할 문자열 데이터가 포함된 컬럼
  • 구분자 : 기본값은 , (쉼표)이며, 원하는 문자로 변경 가능
  • 그룹컬럼 : GROUP BY와 함께 사용하여 그룹을 지정

1.2 GROUP_CONCAT 기본 예제

다음은 employees 테이블에서 부서별 직원 이름을 하나의 문자열로 결합하는 예제입니다.

SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name SEPARATOR ', ') AS employees
FROM employees
GROUP BY department;

출력 예시:
department employees

HRAlice, Bob, Charlie
ITDavid, Eve, Frank
반응형

2. GROUP_CONCAT 고급 활용법

2.1 SEPARATOR 옵션 사용

기본적으로 쉼표(,)가 구분자로 사용되지만, 원하는 문자나 문자열을 지정할 수 있습니다.

SELECT department, GROUP_CONCAT(employee_name SEPARATOR ' | ') AS employees
FROM employees
GROUP BY department;

출력 예시:

HR  |  Alice | Bob | Charlie
IT  |  David | Eve | Frank

2.2 ORDER BY로 정렬 적용

GROUP_CONCAT 내부에서 ORDER BY를 사용하면 특정 기준으로 데이터 정렬이 가능합니다.

SELECT department, GROUP_CONCAT(employee_name ORDER BY hire_date DESC SEPARATOR ', ') AS employees
FROM employees
GROUP BY department;

위 쿼리는 입사일(hire_date) 기준으로 내림차순 정렬하여 직원명을 결합합니다.

2.3 DISTINCT를 활용한 중복 제거

동일한 값이 여러 번 결합되는 경우 DISTINCT 키워드를 사용하면 중복을 제거할 수 있습니다.

SELECT department, GROUP_CONCAT(DISTINCT employee_name SEPARATOR ', ') AS employees
FROM employees
GROUP BY department;

이는 데이터 중복이 발생하는 테이블에서 매우 유용하게 활용될 수 있습니다.

반응형

3. GROUP_CONCAT 성능 최적화

3.1 GROUP_CONCAT 최대 길이 조정

기본적으로 GROUP_CONCAT의 결과 문자열 길이는 group_concat_max_len 시스템 변수에 의해 제한됩니다. 기본값은 1024 바이트이지만, 필요에 따라 증가시킬 수 있습니다.

SET SESSION group_concat_max_len = 100000;

이 설정을 적용하면 세션 동안 더 긴 문자열을 처리할 수 있습니다.

3.2 인덱스 활용 및 쿼리 튜닝

  • GROUP_CONCAT이 많은 데이터를 처리할 경우 성능 저하가 발생할 수 있습니다.
  • 적절한 인덱스를 생성하여 GROUP BY 성능을 개선할 수 있습니다.
  • EXPLAIN을 사용하여 실행 계획을 분석하고, 필요 시 서브쿼리를 활용합니다.
EXPLAIN SELECT department, GROUP_CONCAT(employee_name SEPARATOR ', ') FROM employees GROUP BY department;
반응형

4. 실전 적용 예제

4.1 JSON 형태로 데이터 변환

MySQL 5.7 이상에서는 JSON_ARRAYAGG를 사용하여 JSON 형태로 데이터를 변환할 수 있지만, GROUP_CONCAT을 활용하여도 비슷한 효과를 낼 수 있습니다.

SELECT department, CONCAT('[', GROUP_CONCAT('"', employee_name, '"'), ']') AS json_employees
FROM employees
GROUP BY department;

출력 예시:

HR: ["Alice", "Bob", "Charlie"]
IT: ["David", "Eve", "Frank"]

4.2 CSV 데이터 생성

GROUP_CONCAT은 CSV 데이터를 생성하는 데 매우 유용합니다.

SELECT GROUP_CONCAT(CONCAT(employee_id, ',', employee_name, ',', department) SEPARATOR '\n') AS csv_output
FROM employees;

이제 해당 데이터를 바로 CSV 파일로 저장할 수 있습니다.

반응형

5. 결론

MySQL의 GROUP_CONCAT 함수는 다중 행 데이터를 하나의 문자열로 결합하는 강력한 기능을 제공합니다. 이를 활용하여 JSON 변환, CSV 생성, 보고서 작성 등 다양한 실전 활용이 가능합니다. 하지만 성능 이슈가 발생할 수 있으므로, group_concat_max_len 설정 조정, 인덱스 최적화, 서브쿼리 활용 등을 통해 최적의 성능을 유지해야 합니다. 본 가이드를 참고하여 MySQL GROUP_CONCAT을 효과적으로 활용해 보시길 바랍니다.

반응형