GROUP_CONCAT() 함수란?
MySQL에서 GROUP_CONCAT() 함수를 사용하면 GROUP BY로 묶은 그룹에 속한 모든 항목을 하나의 레코드로 나열할 수 있습니다. 이 함수는 각 그룹의 문자열 값을 하나로 연결해 반환하는 집계 함수로, 기본 구분자는 콤마(,)입니다.
실제 동작을 확인하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
ProductId int,
ProductName varchar(40),
ProductCategory varchar(40)
);
Query OK, 0 rows affected (0.67 sec)테스트 데이터 삽입
insert 명령을 사용해 테이블에 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values(100,'Product-1','1Product'); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(101,'Product-2','2Product'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(100,'Product-1','3Product'); Query OK, 1 row affected (0.14 sec)
전체 데이터 조회
select 문을 사용해 테이블의 모든 레코드를 조회하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+-----------+-------------+-----------------+ | ProductId | ProductName | ProductCategory | +-----------+-------------+-----------------+ | 100 | Product-1 | 1Product | | 101 | Product-2 | 2Product | | 100 | Product-1 | 3Product | +-----------+-------------+-----------------+ 3 rows in set (0.00 sec)
그룹별 항목을 하나의 레코드로 나열하기
이제 GROUP_CONCAT() 함수를 활용해 그룹(ProductId)에 속한 모든 항목을 단일 레코드로 나열하는 쿼리를 작성해 보겠습니다.
mysql> select ProductId,group_concat(ProductCategory) AS `GROUP` FROM DemoTable group by ProductId;
실행 결과는 다음과 같습니다.
+-----------+-------------------+ | ProductId | GROUP | +-----------+-------------------+ | 100 | 1Product,3Product | | 101 | 2Product | +-----------+-------------------+ 2 rows in set (0.00 sec)
ProductId가 100인 레코드 두 개가 하나의 행으로 병합되어 '1Product,3Product' 형태로 출력된 것을 확인할 수 있습니다.
응용: 구분자 변경 및 정렬
GROUP_CONCAT()은 SEPARATOR 옵션으로 구분자를 자유롭게 지정할 수 있으며, ORDER BY 절을 함께 사용하면 연결되는 값의 순서도 정렬할 수 있습니다.
mysql> select ProductId,
group_concat(ProductCategory order by ProductCategory separator '; ') AS `GROUP`
FROM DemoTable group by ProductId;또한 중복 값을 제거하고 싶다면 DISTINCT 키워드를 함께 사용하면 됩니다.
group_concat(DISTINCT ProductCategory)
이처럼 GROUP_CONCAT() 함수를 활용하면 여러 행에 흩어져 있는 그룹 데이터를 손쉽게 하나의 문자열로 집계할 수 있어, 목록형 데이터를 요약해서 보여줄 때 매우 유용합니다.