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
HR | Alice, Bob, Charlie |
IT | David, 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을 효과적으로 활용해 보시길 바랍니다.
'IT > DB' 카테고리의 다른 글
MySQL에서 INSERT와 UPDATE를 동시에 수행하는 방법 (0) | 2025.03.13 |
---|---|
MySQL CAST와 CONVERT의 차이점 완벽 정리 (0) | 2025.03.13 |
MySQL에서 문자열을 개별 행으로 변환하는 방법 (0) | 2025.03.12 |
Index Skew와 Index Sparse 차이 완벽 분석 (0) | 2024.12.26 |
논리적 데이터 모델링과 물리적 데이터 모델링의 차이점 완벽 정리 (0) | 2024.12.26 |