본문 바로가기
IT/DB

MySQL GROUP_CONCAT() 함수 사용방법

by 불멸남생 2025. 4. 2.

MySQL에서 데이터를 효과적으로 집계하고 문자열로 결합하는 데 있어 GROUP_CONCAT() 함수는 매우 유용한 도구입니다. 특히, 다대일 관계의 데이터를 하나의 행으로 출력해야 할 때 핵심적인 역할을 합니다. 본 문서에서는 GROUP_CONCAT() 함수의 기본 사용법부터 고급 활용 사례, 성능 최적화 방법까지 심층적으로 다룹니다. 실무 개발자와 데이터 분석가를 위한 실용적인 예제 중심의 콘텐츠로 구성되어 있습니다.

GROUP_CONCAT() 함수란

GROUP_CONCAT()은 MySQL에서 제공하는 집계 함수 중 하나로, 동일한 그룹에 속한 행들의 특정 컬럼 값을 문자열로 연결해 하나의 결과로 반환합니다. SQL의 GROUP BY 절과 함께 자주 사용되며, 일반적으로 다음과 같은 구조로 작성됩니다:

SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY another_column;

주요 특징

  • 문자열 연결 함수
  • 그룹화된 결과에서 다중 행을 하나의 문자열로 반환
  • 쉼표(,) 외에도 다양한 구분자 사용 가능
반응형

기본 사용법: 단일 컬럼 집계

예제: 고객별 주문 상품 목록 가져오기

SELECT customer_id, GROUP_CONCAT(product_name) AS ordered_products
FROM orders
GROUP BY customer_id;

이 쿼리는 고객 ID별로 주문한 상품 이름들을 쉼표로 구분하여 나열합니다.

기본 옵션 설명

옵션 설명

DISTINCT 중복 값 제거
SEPARATOR 기본 쉼표 외 구분자 지정
ORDER BY 연결 순서 지정 가능
반응형

고급 사용법: DISTINCT, ORDER BY, SEPARATOR 활용

중복 제거 및 정렬

SELECT department_id, 
       GROUP_CONCAT(DISTINCT employee_name ORDER BY employee_name ASC SEPARATOR '; ') AS employees
FROM employees
GROUP BY department_id;

이 쿼리는 부서별 중복되지 않는 사원 이름을 알파벳 순으로 정렬하고, ;으로 구분하여 출력합니다.

다중 컬럼 결합 예시

SELECT project_id,
       GROUP_CONCAT(CONCAT(employee_id, ':', role) SEPARATOR ' | ') AS assignments
FROM project_assignments
GROUP BY project_id;

각 프로젝트에 배정된 사원의 ID와 역할을 연결하여 보기 좋게 출력합니다.

핵심 문법 요약:

  • CONCAT()와 결합해 다중 컬럼 문자열화
  • SEPARATOR는 ' | ' 등 사용자 지정 구분자 사용 가능
  • ORDER BY는 정렬 기준을 유연하게 설정
반응형

제한 사항과 설정 변경

MySQL은 기본적으로 GROUP_CONCAT() 결과 문자열의 최대 길이를 제한합니다. 이 제한은 group_concat_max_len 시스템 변수에 의해 결정됩니다.

기본 최대 길이

> SHOW VARIABLES LIKE 'group_concat_max_len';

기본값은 일반적으로 1024 바이트입니다.

설정 변경 방법

SET SESSION group_concat_max_len = 1000000;

또는 전체 세션에 대해 설정하고 싶다면:

SET GLOBAL group_concat_max_len = 1000000;

주의 사항

  • GROUP_CONCAT()는 반환 길이 초과 시 문자열이 잘립니다.
  • 많은 데이터를 연결하면 성능 저하 및 서버 리소스 증가 위험이 있습니다.
반응형

실무 예제

1. 주문서 PDF 생성용 상품 목록 문자열화

SELECT order_id,
       GROUP_CONCAT(CONCAT(product_name, ' x', quantity) ORDER BY product_name) AS order_summary
FROM order_items
GROUP BY order_id;

전자상거래 시스템에서 주문 내역을 PDF 형태로 출력할 때, 이 구조는 고객별 주문 요약 텍스트로 매우 유용합니다.

2. 인사관리 시스템에서 직무 요약 출력

SELECT employee_id,
       GROUP_CONCAT(DISTINCT position ORDER BY position SEPARATOR ', ') AS all_positions
FROM employee_positions
GROUP BY employee_id;

한 사원이 복수의 직무를 수행하는 경우, 이 데이터를 요약 표시하는 데 GROUP_CONCAT()이 매우 효과적입니다.

반응형

성능 최적화를 위한 고려사항

1. 인덱스 사용

  • GROUP_CONCAT()에 사용되는 컬럼이 인덱스에 포함되어 있으면 성능이 크게 향상됩니다.
  • 특히 GROUP BY 대상 컬럼에는 인덱스를 설정할 것.

2. 반환 문자열 길이 관리

  • 문자열 길이가 길수록 임시 테이블 생성 가능성 증가
  • 가능하면 DISTINCT, ORDER BY 최소화

3. JSON 구조 결합 활용 (MySQL 5.7 이상)

SELECT category_id,
       JSON_ARRAYAGG(product_name) AS product_list_json
FROM products
GROUP BY category_id;

복잡한 응용에서는 JSON 형식으로 데이터를 그룹화하는 것이 효율적입니다. 이후 애플리케이션 단에서 파싱하여 처리 가능합니다.

반응형

자주 발생하는 오류 및 해결 방안

1. 잘림 문제

  • 원인: group_concat_max_len 초과
  • 해결: 세션 또는 글로벌 변수 값을 증가시킬 것

2. NULL 값 포함 시 문제

  • GROUP_CONCAT()은 NULL 값을 무시합니다
  • 해결: IFNULL() 또는 COALESCE()로 처리
SELECT GROUP_CONCAT(IFNULL(nickname, '미지정')) FROM users;

3. ORDER BY에 컬럼 명이 없다는 오류

  • 반드시 GROUP_CONCAT() 내부에서 사용해야 함
  • 해결: 외부 ORDER BY가 아닌 함수 내부 정렬로 작성할 것
반응형

대안 함수 및 비교

함수명 특징 활용도

GROUP_CONCAT() 문자열 집계 텍스트 요약 및 조인 대체
JSON_ARRAYAGG() JSON 배열 반환 구조화된 데이터 필요 시
STRING_AGG() (PostgreSQL 등) 유사 기능 MySQL은 지원 안 함

MySQL에서 유일한 문자열 집계 함수

  • 구조화 필요 시 JSON 함수와 함께 사용
  • 복잡한 구조 결합은 애플리케이션 레벨에서 처리 권장
반응형

결론

GROUP_CONCAT() 함수는 단순한 텍스트 집계를 넘어, 복잡한 데이터 관계를 명확하게 요약할 수 있는 강력한 도구입니다. 다양한 실무 시나리오에서 데이터를 구조적으로 표현하고 가독성을 높이는 데 기여할 수 있습니다. 특히 정렬, 중복 제거, 사용자 지정 구분자, 다중 컬럼 결합 기능을 전략적으로 활용하면, 기존의 복잡한 조인을 최소화하면서 깔끔한 결과를 도출할 수 있습니다.

실제 업무 환경에서 데이터의 효율적 요약은 리포팅, 알림 시스템, 텍스트 기반 출력 등 다양한 영역에서 경쟁력을 갖추는 핵심입니다. GROUP_CONCAT() 함수는 그 핵심 도구 중 하나입니다.

반응형