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

    여러개의 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전자:현대차:현대차                   |

     

     

    댓글

    Designed by JB FACTORY