[MySQL] Group by(그룹바이) 이해하기

    MySQL 혹은 MariaDB에서 뿐만 아니라 오라클(Oracle) DB에서도 Group by는 존재합니다. 워낙 범용적으로 사용되고 데이터의 확인 용도 뿐만 아니라, 통계 등에 사용되기 때문에 필수로 알아야 될 쿼리(Query)인데요. 해당 쿼리에 대해서 알아보도록 하겠습니다.

     

    [MySQL] Group by(그룹바이)


    그룹 바이(Group by)

    우선 해당 쿼리문을 한번에 이해하기 보다는 하나씩 이해하는 편이 좋습니다. 그룹바이라는 쿼리는 데이터를 기준이 되는 값으로 그룹을 묶어서 보여줘라라는 뜻입니다. 해당의 쿼리는 예제를 보면서 확인해보도록 해보죠.

     

    stock_nm|country|exchange|
    --------+-------+--------+
    삼성전자    |korea  |KOSPI   |
    카카오     |korea  |KOSPI   |
    네이버     |korea  |KOSPI   |
    하이브     |korea  |KOSPI   |
    에코프로비엠  |korea  |KOSDAQ  
    펄어비스    |korea  |KOSDAQ  |
    JYP     |korea  |KOSDAQ  |
    APPLE   |usa    |NASDAQ  |
    TESLA   |usa    |NASDAQ  |

     

    위의 예제 테이블(stock)을 보면 주식 종목들이 들어가 있으며, 종목명, 나라, 거래소명이라는 컬럼으로 데이터가 들어가 있습니다. 여기서 그룹을 묶는 방법이 여러가지가 있을텐데요 우선 나라별로 묶는 방법이 있을 것입니다.

     

    select stock_nm, country, exchange from stock
    group by country;

     

    전체를 가져오는 일반적인 쿼리에 group by 컬럼명을 넣으면 아래와 같은 결과가 나타납니다.

    stock_nm|country|exchange|
    --------+-------+--------+
    삼성전자    |korea  |KOSPI   |
    APPLE   |usa    |NASDAQ  |

     

    그러나 뭔가 이상하죠? 그룹으로 묶다보니 stock_nm과 exchange는 어울리지 않는 것 같습니다. 첫번째 데이터를 그냥 보여주기 때문에 일반적으로 group by 를 사용할 때에는 select ~ from 절 사이에는 group by에 사용되는 컬럼만 넣는 것이 일반적인 방식입니다. 그러니 아래와 같은 쿼리로 변경합니다.

     

    select country from stock group by country;

    이렇게 쿼리를 날리게 되면 아래와 같이 심플하게 country만 있게 됩니다.

     

    country|
    -------+
    korea  |
    usa    |

     

    위의 내용을 보면 대충 Group by가 무엇인지 이해가 됐을 것입니다 어떤 값을 기준으로 그룹을 만들어 버린다는 뜻이기 때문이죠. 그러나 Group by 는 혼자서 사용하게 되면 아래의 내용과 동일합니다.

     

    select distinct country from stock;

    바로 distinct를 써서 중복된 데이터를 제거하면 group by와 결과가 동일해지게 되는 것이죠. group by는 단순히 컬럼 하나만 놓고 본다면 이와같이 distinct와 동일하지만, 다른 절을 곁들여서 쓸 수 있습니다. 

     

     

    Group by 활용

    그룹으로 데이터를 묶었다는 것은 그룹안에 데이터들이 묶여 있다는 뜻입니다. 바로 여기서 distinct와 차이가 나게 되는데요. 아래와 같이 Group by 를 활용할 수 있게됩니다.

     

    count(*) 조합

    select country, count(*) from stock 
    group by country;

     

    우선 가장 많이 활용되는 것이 바로 count 입니다. 데이터를 얼만큼 들어가 있는지 확인하는 용도 뿐만 아니라 통계를 내서 리포트를 만들기에도 용이한 조합입니다.

     

    country|count(*)|
    -------+--------+
    korea  |       7|
    usa    |       2|

     

    sum(*) 조합

    이번에는 주식 테이블에 현재 종목 가격을 추가했습니다.

     

    stock_nm|country|exchange|price |
    --------+-------+--------+------+
    APPLE   |usa    |NASDAQ  |195000|
    JYP     |korea  |KOSDAQ  | 58800|
    TESLA   |usa    |NASDAQ  |371350|
    네이버     |korea  |KOSPI   |193500|
    삼성전자    |korea  |KOSPI   | 53100|
    에코프로비엠  |korea  |KOSDAQ  | 88100|
    카카오     |korea  |KOSPI   | 57100|
    펄어비스    |korea  |KOSDAQ  | 46650|
    하이브     |korea  |KOSPI   |135000|

     

    그리고 아래와 같이 sum(*)을 조합해보도록 해보죠.

    select country, sum(price) from stock 
    group by country;

     

    country로 조합이 된 데이터 그룹들의 종목가를 합친 것을 알 수 있습니다.

    country|sum(price)|
    -------+----------+
    korea  |    632250|
    usa    |    566350|

     

    avg(*) 조합

    select exchange, avg(price) from stock 
    group by exchange;

     

    avg를 사용하면 그룹으로 묶인 데이터 그룹들의 평균을 알 수 있습니다. 이번에는 country로 그룹을 하지 않고 거래소(exchange)로 그룹을 묶었습니다.

     

    exchange|avg(price) |
    --------+-----------+
    KOSDAQ  | 64516.6667|
    KOSPI   |109675.0000|
    NASDAQ  |283175.0000|

     

    코스피, 코스닥, 나스닥의 종목들의 평균가격이 쉽게 쿼리로 알 수 있게 되었습니다. 다음에는 그룹바이를 좀 더 확장하는 해빙절(Having ~)에 대해서 알아보도록 하겠습니다.

     

    반응형

    댓글

    Designed by JB FACTORY