MySQL에서 여러 개의 행(row)을 쉼표로 구분된 하나의 문자열 목록으로 결합하려면 GROUP_CONCAT() 함수를 사용하면 됩니다. 이 함수는 GROUP BY 절과 함께 활용하면 그룹별로 여러 값을 하나의 문자열로 손쉽게 합칠 수 있어, 태그 목록이나 카테고리 집계 등 다양한 상황에서 유용하게 사용됩니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(30),
Marks int
);
Query OK, 0 rows affected (0.52 sec)
이제 INSERT 명령을 사용하여 테이블에 샘플 데이터를 삽입합니다.
mysql> insert into DemoTable(Name,Marks) values('John',67);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable(Name,Marks) values('Carol',69);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(Name,Marks) values('Sam',69);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Name,Marks) values('David',78);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(Name,Marks) values('Chris',69);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Name,Marks) values('Bob',67);
Query OK, 1 row affected (0.17 sec)SELECT 문을 실행하여 테이블에 저장된 전체 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+----+-------+-------+
| Id | Name | Marks |
+----+-------+-------+
| 1 | John | 67 |
| 2 | Carol | 69 |
| 3 | Sam | 69 |
| 4 | David | 78 |
| 5 | Chris | 69 |
| 6 | Bob | 67 |
+----+-------+-------+
6 rows in set (0.00 sec)
다음은 GROUP_CONCAT() 함수를 사용하여 여러 행을 쉼표로 구분된 목록으로 결합하는 쿼리입니다.
mysql> SELECT Marks, GROUP_CONCAT(Name ORDER BY Name ASC SEPARATOR ', ')
from DemoTable GROUP BY Marks;
출력 결과
+-------+-----------------------------------------------------+
| Marks | GROUP_CONCAT(Name ORDER BY Name ASC SEPARATOR ', ') |
+-------+-----------------------------------------------------+
| 67 | Bob, John |
| 69 | Carol, Chris, Sam |
| 78 | David |
+-------+-----------------------------------------------------+
3 rows in set (0.00 sec)
쿼리 설명
위 쿼리가 동작하는 방식을 살펴보겠습니다.
GROUP BY Marks — 동일한 점수(Marks)를 가진 행들을 하나의 그룹으로 묶습니다. 예제에서는 67점, 69점, 78점 세 개의 그룹이 만들어집니다.
ORDER BY Name ASC — 각 그룹 내에서 이름을 알파벳 순으로 정렬하여 출력 순서를 일관되게 유지합니다. 덕분에 'Carol, Chris, Sam'처럼 정렬된 형태로 결과가 나타납니다.
SEPARATOR ', ' — 기본 구분자는 쉼표(,)이지만, SEPARATOR 옵션을 사용하면 원하는 구분자를 지정할 수 있습니다. 여기서는 쉼표 뒤에 공백을 추가하여 가독성을 높였습니다.
이처럼 GROUP_CONCAT() 함수를 활용하면 별도의 애플리케이션 로직 없이도 SQL 쿼리만으로 여러 행의 데이터를 깔끔하게 하나의 목록으로 변환할 수 있습니다.