Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL GROUP_CONCAT()로 여러 행의 데이터를 하나의 필드로 합치는 방법

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()은 그룹화된 데이터를 가독성 좋게 요약해서 보여줘야 하는 상황에서 매우 유용하게 활용할 수 있습니다.