MySQL GROUP_CONCAT() 함수 설명: 구문, 예제 및 성능 팁

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()의 성능이 저하될 수 있으며, 특히 DISTINCTORDER BY를 사용할 경우 더욱 그렇습니다. 성능을 최적화하려면 다음을 고려하십시오:

  • 인덱스 사용 : GROUP BY에 사용되는 열에 인덱스를 적용하여 쿼리 성능을 향상시킵니다.
  • 적절한 최대 길이 설정 : 불필요하게 큰 출력이 발생하지 않도록 필요에 따라 group_concat_max_len을 조정합니다.

5. 다른 집계 함수와의 비교

GROUP_CONCAT()COUNT()SUM()과 다른계 함수와 달리 데이터를 문자열로 연결합니다. 아래는 COUNT()와의 비교입니다.

5.1 COUNT()와의 차이점

COUNT()는 조건에 맞는 행의 수를 반환하는 반면, GROUP_CONCAT()은 값을 문자열로 연결합니다. 예를 들어, 각 부서의 직원 수를 세려면 다음과 같습니다:

SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department;

이 쿼리는 각 부서의 직원 수를 반환합니다.

6. 결론

GROUP_CONCAT() 함수는 MySQL에서 가장 유연한 집계 함수 중 하나입니다. 데이터를 사용자 정의 및 고급 응용과 함께 단일 문자열로 결합할 수 있어 데이터베이스 시각화와 보고에 매우 효과적입니다. 다만 문자열 길이 제한 및 성능 문제에 유의하고, 설정을 적절히 조정해야 합니다. 다른 집계 함수와 결합하면 보다 강력한 데이터 조작이 가능합니다.