MySQL에서 여러 행에 흩어져 있는 값을 하나의 문자열로 합치려면 group_concat() 함수를 사용하면 됩니다. 이 함수는 지정한 컬럼의 값들을 쉼표(,) 같은 구분자로 이어 붙여 단일 문자열로 반환해 주기 때문에, 목록 형태의 결과를 만들 때 매우 유용합니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Subject varchar(10)
-> );
Query OK, 0 rows affected (0.43 sec)
2. 샘플 데이터 입력
insert 명령으로 데이터를 입력합니다. 이때 중복 제거 효과를 확인할 수 있도록 의도적으로 같은 값('C++', 'MongoDB', 'Java')을 여러 번 넣었습니다.
mysql> insert into DemoTable values('C');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('C++');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('C++');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable values('MongoDB');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('MySQL');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('MongoDB');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('MongoDB');
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable values('Java');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('Java');
Query OK, 1 row affected (0.10 sec)3. 전체 데이터 확인
select 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과
+---------+
| Subject |
+---------+
| C |
| C++ |
| C++ |
| MongoDB |
| MySQL |
| MongoDB |
| MongoDB |
| Java |
| Java |
+---------+
9 rows in set (0.00 sec)
총 9개의 행이 있으며, 그중 일부 값은 중복되어 있습니다.
4. 중복을 제거한 결과를 문자열로 연결하기
다음은 서브쿼리에서 group by로 중복을 먼저 제거한 뒤, 외부 쿼리에서 group_concat()으로 값을 하나의 문자열로 합치는 쿼리입니다.
mysql> select group_concat(tbl.sub) from (select Subject sub from DemoTable group by Subject ) tbl;
실행 결과
+--------------------------+
| group_concat(tbl.sub) |
+--------------------------+
| C,C++,MongoDB,MySQL,Java |
+--------------------------+
1 row in set (0.04 sec)
중복 없이 5개의 과목명이 쉼표로 구분된 하나의 문자열로 깔끔하게 출력된 것을 확인할 수 있습니다.
5. 더 간단한 방법: DISTINCT 키워드 활용
서브쿼리 없이 group_concat() 안에 DISTINCT를 직접 사용하면 더 짧은 쿼리로 동일한 결과를 얻을 수 있습니다.
mysql> select group_concat(distinct Subject) from DemoTable;
또한 SEPARATOR 옵션을 사용하면 기본 구분자인 쉼표 대신 원하는 구분자를 지정할 수도 있습니다.
mysql> select group_concat(distinct Subject separator ' | ') from DemoTable;
-- 결과 예시: C | C++ | MongoDB | MySQL | Java
정리
MySQL에서 중복 제거된 쿼리 결과를 문자열로 연결하려면 group_concat() 함수를 사용하면 됩니다. 서브쿼리 + group by 조합 또는 group_concat(distinct ...) 방식을 상황에 맞게 선택하고, 필요하다면 SEPARATOR로 구분자를 자유롭게 변경할 수 있습니다.