중복 데이터를 정리하면서 각 항목의 값을 하나의 목록으로 묶어야 할 때가 있습니다. 이럴 때 GROUP_CONCAT() 함수를 사용하면 여러 행의 값을 쉼표로 구분된 단일 문자열로 손쉽게 변환할 수 있으며, DISTINCT 키워드를 함께 사용하면 중복된 값까지 제거한 고유한 목록을 얻을 수 있습니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(40), Score int ); Query OK, 0 rows affected (0.53 sec)
2. 레코드 삽입
INSERT 문을 사용해 의도적으로 중복이 포함된 레코드들을 입력합니다.
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(Name,Score) values('Robert',78);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.42 sec)
mysql> insert into DemoTable(Name,Score) values('Bob',89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',57);
Query OK, 1 row affected (0.13 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
아래 출력 결과에서 볼 수 있듯이 'Chris'라는 이름이 여러 번 반복되며, 특히 점수 56은 동일하게 중복되어 저장되어 있습니다.
+----+--------+-------+ | Id | Name | Score | +----+--------+-------+ | 1 | Chris | 56 | | 2 | Robert | 78 | | 3 | Chris | 56 | | 4 | Bob | 89 | | 5 | Chris | 56 | | 6 | Chris | 57 | +----+--------+-------+ 6 rows in set (0.00 sec)
4. GROUP_CONCAT와 DISTINCT로 중복 제거하기
이제 GROUP BY와 함께 GROUP_CONCAT(DISTINCT ...)를 사용하여 각 이름별로 중복 없는 점수 목록을 만들어 보겠습니다.
mysql> select Name, group_concat(DISTINCT Score separator ',') from DemoTable group by Name;
실행 결과는 다음과 같습니다.
+--------+--------------------------------------------+ | Name | group_concat(DISTINCT Score separator ',') | +--------+--------------------------------------------+ | Bob | 89 | | Chris | 56,57 | | Robert | 78 | +--------+--------------------------------------------+ 3 rows in set (0.00 sec)
'Chris'의 경우 원래 세 개의 레코드(56, 56, 57)가 있었지만, DISTINCT 덕분에 중복된 56이 제거되고 "56,57"이라는 고유한 값 목록만 반환된 것을 확인할 수 있습니다.
핵심 포인트 정리
- GROUP_CONCAT(): 그룹별로 여러 행의 값을 하나의 문자열로 연결합니다.
- DISTINCT: 그룹 내에서 중복된 값을 제거하여 고유한 값만 남깁니다.
- SEPARATOR ',': 기본 구분자도 쉼표이지만, 명시적으로 지정하면 의도를 더 분명하게 드러낼 수 있습니다.
이처럼 GROUP_CONCAT과 DISTINCT를 조합하면 중복 데이터를 효율적으로 정리하고, 각 항목별 값을 깔끔한 쉼표 구분 목록 형태로 표현할 수 있습니다.