빅데이터 및 DB/MySQL

[MySQL] group_concat 사용법 모음 (문자열 구분자 묶음)

Steve Jang 2022. 4. 22. 12:49

여러개의 Row로 되어 있는 데이터를 한개의 값으로 묶어서 가지고 오고 싶을 경우, MySQL(혹은 MariaDB)에서는 Group_Concat을 사용하여 처리할 수 있다. 

 

[MySQL] group_concat 사용법 모음 (문자열 구분자 묶음)


실행 예시

테이블 생성

CREATE TABLE `stock` (
  `stock_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'pk',
  `exchange` varchar(10) NOT NULL COMMENT '구분',
  `stock_nm` varchar(50) NOT NULL COMMENT '주식명',
  `ticker` varchar(10) NOT NULL COMMENT '티커',
  PRIMARY KEY (`stock_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

 

데이터 삽입

INSERT INTO my_place.stock
(exchange, stock_nm, ticker)
VALUES('kospi', '삼성전자', '005930');

INSERT INTO my_place.stock
(exchange, stock_nm, ticker)
VALUES('kospi', 'LG전자', '066570');

INSERT INTO my_place.stock
(exchange, stock_nm, ticker)
VALUES('kospi', '현대차', '005380');

INSERT INTO my_place.stock
(exchange, stock_nm, ticker)
VALUES('kosdaq', 'JYP Ent', '035900');

 

저장된 데이터

 

 

Group_Concat

거래소가 코스피인 주식종목 group_concat

select 
	exchange, 
	group_concat(stock_nm) from stock 
where exchange = 'kospi';
exchange|group_concat(stock_nm)|
--------+----------------------+
kospi   |삼성전자,LG전자,현대차         |

 

 

group_concat 정렬(order by)

select 
	exchange, 
	group_concat(stock_nm order by stock_id desc) from stock 
where exchange = 'kospi';

 

stock_id를 내림차순으로 정렬한 후 group_concat

exchange|group_concat(stock_nm order by stock_id desc)|
--------+---------------------------------------------+
kospi   |현대차,LG전자,삼성전자                                |

 

group_concat 중복제거

중복 데이터 추가

INSERT INTO my_place.stock
(exchange, stock_nm, ticker)
VALUES('kospi', '현대차', '005380');

 

현대차가 중복이 되어 있는 모습

 

 

중복 데이터 확인

select 
	exchange, 
	group_concat(stock_nm) from stock 
where exchange = 'kospi';
exchange|group_concat(stock_nm)|
--------+----------------------+
kospi   |삼성전자,LG전자,현대차,현대차     |

데이터가 중복이 있으면, 위와 같이 중복으로 데이터가 들어가게 된다. 중복으로 데이터가 들어가길 원치 않는다면...

 

중복 제거 concat 쿼리

select 
	exchange, 
	group_concat(distinct stock_nm) from stock 
where exchange = 'kospi';

이와 같이 distinct를 사용하여, 중복을 제거한다.

 

중복이 제거된 모습

exchange|group_concat(distinct stock_nm)|
--------+-------------------------------+
kospi   |LG전자,삼성전자,현대차                  |

 

group_concat 구분자 변경

group_concat은 default로 콤마(,)를 구분자로 사용한다. 하지만 데이터에 콤마가 들어가는 경우, 문제가 발생할 수 있기에 다른 구분자를 사용하는 것도 지원을 해준다

 

콜론(:)으로 구분자를 변경하는 경우

select 
	exchange, 
	group_concat(stock_nm separator ':') from stock 
where exchange = 'kospi';
exchange|group_concat(stock_nm separator ':')|
--------+------------------------------------+
kospi   |삼성전자:LG전자:현대차:현대차                   |