1. MySQL GROUP_CONCAT() 함수의 기본 사용법
GROUP_CONCAT()은 여러 행의 값을 하나의 문자열로 연결하는 MySQL 집계 함수입니다. 이를 통해 여러 데이터 조각을 하나의 필드에 결합할 수 있습니다. 특히 집계된 결과나 요약된 데이터를 효율적으로 표시하고자 할 때 유용합니다.
기본 구문
GROUP_CONCAT()의 기본 구문은 다음과 같습니다:
SELECT GROUP_CONCAT(column_name) FROM table_name GROUP BY column_name;
이 함수는 일반적으로 GROUP BY 절과 함께 사용됩니다. 예를 들어, 다음 쿼리는 부서별로 직원 이름을 그룹화하여 표시합니다:
SELECT department, GROUP_CONCAT(employee_name) FROM employees GROUP BY department;
이 쿼리는 각 부서에 속한 직원 이름을 쉼표로 구분된 문자열로 반환합니다.
2. GROUP_CONCAT() 함수의 사용자 정의 옵션
GROUP_CONCAT() 함수는 단순히 값을 결합하는 것을 넘어 다양한 사용자 정의 옵션을 제공합니다. 구분자를 변경하고, 중복 값을 제거하며, 정렬 순서를 지정하는 등 고급 사용을 위한 기능을 활용할 수 있습니다.
2.1 구분자 변경
기본적으로 GROUP_CONCAT()은 값을 쉼표로 구분합니다. 그러나 SEPARATOR 키워드를 사용하여 구분자를 변경할 수 있습니다. 예를 들어, 직원 이름을 세미콜론으로 구분하려면 다음과 같이 작성합니다:
SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;
이 쿼드는 직원 이름을 세미콜론으로 구분된 문자열로 출력합니다.
2.2 중복 값 제거
기본적으로 GROUP_CONCAT()은 모든 중복 값을 포함합니다. DISTINCT 키워드를 사용하면 중복 값을 제거할 수 있습니다. 아래 예시는 중복된 직원 이름을 제거하는 쿼리입니다:
SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;
2.3 결과 정렬
GROUP_CONCAT() 내부에서 연결된 요소의 순서를 제어할 수 있습니다. ORDER BY 절을 사용하면 값을 오름차순 또는 내림차순으로 정렬할 수 있습니다. 다음 예시는 직원 이름을 알파벳 순으로 정렬합니다:
SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;
이 쿼드는 직원 이름을 알파벳 순으로 연결합니다. 내림차순으로 정렬하려면 DESC를 사용하십시오.
3. GROUP_CONCAT()의 고급 사용 사례
3.1 카테고리별 제품 목록 만들기
GROUP_CONCAT()을 사용하면 각 카테고리별로 제품 이름 목록을 만들 수 있습니다. 예를 들어, 다음 쿼리는 각 카테고리 내에서 제품 이름을 알파벳 순으로 정렬하여 가져옵니다:
SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;
결과는 다음과 같이 표시됩니다:
category product_list
Electronics Laptop, Phone, TV
Furniture Sofa, Table

3.2 여러 열 연결
GROUP_CONCAT()을 사용해 여러 열을 결합할 때는 사용자 정의 구분자를 사용해 열을 연결할 수 있습니다. 아래 예시에서는 제품 ID와 제품 이름을 콜론(:)으로 연결하여 하나의 문자열로 합칩니다:
SELECT category, GROUP_CONCAT(CONCAT(product_id, ':', product_name) ORDER BY product_name) AS product_info
FROM products
GROUP BY category;
이 쿼드는 각 카테고리별로 제품 ID와 제품 이름을 결합한 결과를 반환합니다.
4. GROUP_CONCAT()의 제한 사항 및 성능 튜닝
GROUP_CONCAT()을 사용할 때는 기본 출력 길이 제한이 1024 문자라는 점을 유의해야 합니다. 또한 대용량 데이터셋을 다룰 경우 성능 고려가 중요합니다.
4.1 최대 문자열 길이 변경
기본 최대 길이가 충분하지 않을 경우, 세션 설정을 변경하여 허용되는 결과 길이를 늘릴 수 있습니다. 다음 쿼리는 세션 최대 길이를 10,000 바이트로 설정합니다:
SET SESSION group_concat_max_len = 10000;
이 구성으로, 더 큰 데이터셋에서도 올바르게 결과를 가져올 수 있습니다.
4.2 성능 최적화
대용량 데이터를 다룰 때 GROUP_CONCAT()의 성능이 문제가 될 수 있습니다. 특히 DISTINCT와 ORDER BY를 자주 사용하면 처리 시간이 늘어날 수 있습니다. 성능을 최적화하려면 다음 사항을 고려하십시오:
- 인덱스 사용:
GROUP BY절에 사용되는 열에 인덱스를 추가하면 쿼리 성능이 크게 향상됩니다. - 적절한 최대 길이 설정: 필요에 따라
group_concat_max_len를 조정하여 불필요하게 큰 결과 집합이 생성되는 것을 방지합니다.
5. 다른 집계 함수와의 비교
GROUP_CONCAT()는 COUNT() 및 SUM()과 같은 다른 집계 함수와 달리 데이터를 단일 문자열로 연결합니다. 이 섹션에서는 GROUP_CONCAT()와 COUNT()의 차이점을 설명합니다.
5.1 COUNT()와의 차이점
COUNT()는 특정 조건에 일치하는 행 수를 세는 함수입니다. GROUP_CONCAT()가 문자열을 연결하고 출력하는 반면, COUNT()는 숫자 값을 반환합니다. 예를 들어, 다음 쿼리는 각 부서의 직원 수를 셉니다:
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;
이를 통해 각 부서에 속한 직원 수를 셀 수 있습니다.
6. 결론
GROUP_CONCAT()는 MySQL에서 가장 유연한 집계 함수 중 하나입니다. 데이터를 단일 문자열로 결합하고 사용자 정의 및 고급 사용을 허용하기 때문에 데이터베이스 시각화 및 보고서 생성에 매우 효과적입니다. 그러나 문자 길이 제한 및 잠재적인 성능 영향을 인식하고 필요에 따라 적절한 설정을 구성해야 합니다. 다른 집계 함수와 결합하면 더욱 강력한 데이터 조작이 가능합니다.


