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

MySQL에서 GROUP_CONCAT과 CONCAT으로 여러 행과 열을 하나의 행으로 합치는 방법

개요

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 절을 사용해 정렬 순서를 지정하는 것도 가능합니다.