개요
MySQL에서 여러 개의 행(row)과 열(column) 데이터를 하나의 행으로 연결해야 할 때가 있습니다. 이럴 때 GROUP_CONCAT() 함수와 CONCAT() 함수를 함께 사용하면 손쉽게 해결할 수 있습니다.
이 글에서는 실제 예제 테이블을 만들고, 여러 행에 흩어져 있는 데이터를 콤마(,)로 구분된 단일 문자열로 합치는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 테스트용 테이블을 생성합니다. 클라이언트 ID, 이름, 나이 세 개의 컬럼으로 구성된 테이블입니다.
mysql> create table DemoTable1463
-> (
-> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName varchar(20),
-> ClientAge int
-> );
Query OK, 0 rows affected (1.37 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 네 개의 레코드를 추가합니다. 참고로 세 번째 레코드는 나이 값이 NULL인 경우를 테스트하기 위해 의도적으로 비워 두었습니다.
mysql> insert into DemoTable1463(ClientName,ClientAge) values('Adam Smith',34);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('John Doe',29);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('David Miller',NULL);
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('John Smith',32);
Query OK, 1 row affected (0.14 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1463;
실행 결과는 다음과 같습니다.
+----------+--------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+--------------+-----------+
| 1 | Adam Smith | 34 |
| 2 | John Doe | 29 |
| 3 | David Miller | NULL |
| 4 | John Smith | 32 |
+----------+--------------+-----------+
4 rows in set (0.00 sec)
4. 여러 행과 열을 하나의 행으로 연결하기
이제 핵심 쿼리입니다. GROUP_CONCAT() 안에 CONCAT()을 중첩하여 각 행의 여러 컬럼 값을 하나의 문자열로 만들고, 그 결과들을 다시 콤마로 연결합니다.
여기서 주목할 점은 IFNULL() 함수입니다. ClientAge 컬럼에 NULL이 포함되어 있으면 CONCAT 결과 전체가 NULL이 되어버리기 때문에, IFNULL로 NULL 값을 빈 문자열('')로 대체하여 처리했습니다.
mysql> select group_concat(concat(ClientId,':',ClientName,':',IFNULL(ClientAge,''))) from DemoTable1463;
실행 결과는 다음과 같습니다.
+------------------------------------------------------------------------+
| group_concat(concat(ClientId,':',ClientName,':',IFNULL(ClientAge,''))) |
+------------------------------------------------------------------------+
| 1:Adam Smith:34,2:John Doe:29,3:David Miller:,4:John Smith:32 |
+------------------------------------------------------------------------+
1 row in set (0.04 sec)
정리
- CONCAT(): 하나의 행 내에서 여러 컬럼 값을 지정한 구분자(:)와 함께 하나의 문자열로 합칩니다.
- GROUP_CONCAT(): 여러 행의 결과값을 기본 구분자인 콤마(,)로 이어 하나의 행으로 반환합니다.
- IFNULL(): NULL 값이 포함된 경우 CONCAT 결과가 통째로 NULL이 되는 것을 방지합니다.
이 세 가지 함수를 조합하면 별도의 애플리케이션 로직 없이 SQL만으로 여러 행·열 데이터를 깔끔하게 하나의 문자열로 변환할 수 있습니다. 필요에 따라 GROUP_CONCAT에 SEPARATOR 옵션을 추가하거나 ORDER BY 절을 사용해 정렬 순서를 지정하는 것도 가능합니다.