MySQL에서 여러 행에 흩어져 있는 값들을 하나의 필드(단일 문자열)로 묶어서 반환해야 하는 경우가 자주 있습니다. 예를 들어 과목별로 수강 학생 목록을 한 줄로 표시하고 싶을 때 유용한데요, 이럴 때 사용하는 것이 바로 GROUP_CONCAT() 함수입니다.
1. 테이블 생성하기
먼저 실습에 사용할 테이블을 생성하겠습니다.
mysql> create table DemoTable2024
-> (
-> SubjectName varchar(20),
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (0.62 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable2024 values('MySQL','Chris');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable2024 values('MySQL','David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2024 values('MongoDB','Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable2024 values('Java','Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable2024 values('MongoDB','Mike');
Query OK, 1 row affected (0.17 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable2024;
실행 결과는 다음과 같습니다.
+-------------+-------------+ | SubjectName | StudentName | +-------------+-------------+ | MySQL | Chris | | MySQL | David | | MongoDB | Bob | | Java | Sam | | MongoDB | Mike | +-------------+-------------+ 5 rows in set (0.00 sec)
현재 같은 과목명이 여러 행에 걸쳐 중복되어 있는 것을 확인할 수 있습니다.
4. GROUP_CONCAT()으로 여러 행을 하나의 필드로 반환하기
이제 GROUP_CONCAT() 함수를 사용해 서로 다른 행의 값들을 하나의 필드로 합쳐 보겠습니다. GROUP BY 절과 함께 사용하면 그룹별로 학생 이름들이 쉼표(,)로 구분된 하나의 문자열로 반환됩니다.
mysql> select SubjectName, group_concat(StudentName)
-> from DemoTable2024
-> group by SubjectName;실행 결과는 다음과 같습니다.
+-------------+---------------------------+ | SubjectName | group_concat(StudentName) | +-------------+---------------------------+ | Java | Sam | | MongoDB | Bob,Mike | | MySQL | Chris,David | +-------------+---------------------------+ 3 rows in set (0.06 sec)
정리 및 활용 팁
GROUP_CONCAT()은 기본적으로 쉼표로 값을 구분하지만, SEPARATOR 옵션을 사용하면 원하는 구분자를 지정할 수 있습니다. 예를 들어 group_concat(StudentName SEPARATOR ' / ')처럼 작성하면 각 값이 ' / '로 구분됩니다.
또한 ORDER BY 절을 함께 사용하면 연결되는 값들의 정렬 순서도 지정할 수 있으며, 결과가 너무 길어 잘리는 것을 방지하려면 group_concat_max_len 시스템 변수 값을 조정하면 됩니다. 이처럼 GROUP_CONCAT()은 그룹화된 데이터를 가독성 좋게 요약해서 보여줘야 하는 상황에서 매우 유용하게 활용할 수 있습니다.