MySQL에서 여러 행에 흩어져 있는 데이터를 하나의 문자열로 합치고 싶다면 GROUP_CONCAT() 함수가 가장 유용한 해결책입니다. 이 글에서는 실제 예제를 통해 테이블 생성부터 저장 프로시저(Stored Procedure) 작성, 그리고 조건에 맞는 여러 행을 연결하는 과정까지 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable (CountryName varchar(100)); Query OK, 0 rows affected (1.01 sec)
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 국가명 레코드를 추가합니다.
mysql> insert into DemoTable values('US');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('AUS');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('UK');
Query OK, 1 row affected (0.19 sec)3. 데이터 조회하기
SELECT 문으로 테이블에 저장된 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+ | CountryName | +-------------+ | US | | AUS | | UK | +-------------+ 3 rows in set (0.00 sec)
4. 저장 프로시저로 여러 행 연결하기
여러 행을 하나의 값으로 연결하려면 GROUP_CONCAT() 함수를 사용합니다. 아래에서는 검색 패턴과 출력 값을 매개변수로 받는 저장 프로시저를 생성했습니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE searchDemo(in stringValue varchar(255), out output text)
BEGIN
select group_concat(distinct CountryName order by CountryName) into output from DemoTable where
CountryName like stringValue;
END
//
Query OK, 0 rows affected (0.18 sec)
mysql> DELIMITER ;이 프로시저의 핵심은 group_concat(distinct CountryName order by CountryName) 부분입니다. DISTINCT로 중복된 국가명을 제거하고, ORDER BY로 결과를 알파벳 순서로 정렬한 뒤 쉼표(,)로 구분된 하나의 문자열로 연결합니다. WHERE 절의 LIKE 조건을 통해 원하는 패턴과 일치하는 행만 대상으로 삼을 수 있습니다.
5. 프로시저 호출 및 결과 확인하기
CALL 명령어로 저장 프로시저를 호출합니다. 여기서는 'U'로 시작하는 국가명을 검색해 보겠습니다.
mysql> call searchDemo('U%',@output);
Query OK, 1 row affected, 2 warnings (0.04 sec)@output 변수에 담긴 결과값을 확인합니다.
mysql> select @output;
실행 결과는 다음과 같습니다.
+---------+ | @output | +---------+ | UK,US | +---------+ 1 row in set (0.00 sec)
마무리
이처럼 GROUP_CONCAT() 함수를 활용하면 여러 행에 나뉜 데이터를 'UK,US'처럼 하나의 문자열로 손쉽게 병합할 수 있습니다. 특히 저장 프로시저와 결합하면 검색 조건을 동적으로 전달할 수 있어 재사용성이 뛰어납니다. 참고로 GROUP_CONCAT()에는 기본 최대 길이 제한(group_concat_max_len, 기본값 1024바이트)이 있으므로, 대량의 데이터를 연결할 때는 해당 시스템 변수를 적절히 늘려주는 것이 좋습니다.