ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL GROUP BY
    Database 2021. 4. 9. 15:24
    728x90

    그룹화 - GROUP BY

    GROUP BY 구를 사용해 집계함수로 넘겨줄 집합을 그룹으로 나눌수 있다.

    SELECT * FROM 테이블명 GROUP BY 열1, 열2..

     

    아래와 같은 products 테이블을 예로 GROUP BY를 알아보자!


    GROUP BY

    select category_id from products group by category_id;

    select 구에 category_id 열을 지정하여 그룹화된 열의 데이터가 클라이언트로 반환된다.

    group by의 결과로 앞서 살펴보았던 DISTINCT (중복제거) 를 사용했을때와 같은 결과가 나온다.

    이로 인해, group by 구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶이는 것을 알 수 있다.

    즉 그룹화할 경우 DISTINCT와 같이 중복을 제거하는 효과가 있음을 알 수 있다.

    category_id 열의 값이 1인 모든 행을 하나의 그룹으로 묶어서 클라이언트에 반환된다.

    (category_id = 1인 행이 하나 이상일 수 있다는 뜻이다)


    GROUP BY 와 DISTINCT 중복 제거의 차이

    앞 예제에서 DISTINCT와 같은 결과가 나오는 것을 확인하였다 그렇다면 두가지는 어떤 차이가 있을까?

    결론부터 말하자면 어떤 정보가 필요한지 상황에 따라 다르다고 할 수 있다.

     

    단순 중복 제거한 값만 필요하다면 GROUP BY를 사용할 필요가 없다.

    하지만, 중복 제거한 값을 이용해 집계함수(COUNT, SUM, AVG..)등 그룹화된 열을 이용해 추가 정보를 얻고자 하는 경우 GROUP BY를 사용한다.

    GROUP BY의 경우 집계함수와 함께 사용하지 않으면 큰 의미가 없다고 할 수 있다. 그룹화된 각각의 그룹이 하나의 집합으로 집계함수의 인수로 넘겨지기 때문이다. 

    GROUP BY는 항상 집계함수와 함께 사용함을 기억하자.


    GROUP BY와 집계 함수

    select category_id, count(category_id), sum(price) from products group by category_id;

    그룹화한 열을 집계함수의 인수로 사용하여 카테고리 ID의 갯수를 카운트하고 동일 카테고리 ID의 가격을 모두 더해 별명으로 나타내었다.

    실 예시로 각 점포별 실적을 집계하고 어떤 점포의 매출이 가장 올라갔는지 어떤 상품이 잘 팔리는지 등 데이터 분석 등에 많이 사용된다.

    


    WHERE 구 + 집계 함수

    집계함수는 WHERE 구의 조건식으로 이용할 수 없다.

    카운트 카데고리 id가 1인 값만을 반환하고자할때 where 구에 집계함수를 이용해 조건을 걸수 없다는 뜻이다.

    아래와 같은 명령은 실행되지 않는다.

    select category_id, count(category_id), sum(price) from products 
    where count(category_id) = 1 group by category_id;

     

    이유는 내부처리 순서에 있다.

    WHERE 구 -> GROUP BY 구 -> SELECT 구 -> ORDER BY 구

    WHERE 구의 처리순서가 GROUP BY보다 먼저 처리되기 때문에 SELECT 구에 지정한 count(category_id) 별명을 사용할 수 없다.

    같은 이유로 그룹화가 필요한 집계함수는 WHERE 구에서 지정할 수 없다!

    (ORDER BY COUNT(category_id)와 같이 처리할 수 있다!)

    그렇다면 집계한 결과에서 조건에 맞는 값을 따로 걸러낼 수 는 없을까??

    HAVING 구로 조건을 지정하는 할 수 있다!!!


    HAVING 구 조건지정(집계함수 조건 지정)

    HAVING 구는 GROUP BY 구 뒤에 기술하며 WHERE 구와 동일하게 조건식을 지정할 수 있다.

    조건식에 집계함수의 결과값이 전달된다고 이해하면 된다.

    위에서 에러가 발생했던 코드를 아래와 같이 명령할 수 있다.

    결과적으로 집계함수를 사용하여 조건을 지정하고 싶을때 HAVING 구를 사용하면 된다.

    select category_id, count(category_id), sum(price) from products 
    group by category_id having count(category_id) = 1;


    주의, 복수열의 그룹화

    그룹화 할 경우 주의할 점이 하나 있다.

    GROUP BY로 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 기술할 수 없다는 점이다.

    그룹화하면 클라이언트로 반환되는 결과가 그룹당 하나의 행이 되는데

    지정한 열 이외의 열을 집계함수 없이 기술한다면 그룹화된 열의 A행에 대한 결과로 하나 이상의 행이 반환되기 때문에 어떤 값을 반환해야 할지 몰라 에러가 발생하게 된다.

    select no, name, price from examples group by name; (X)
    select name from examples group by name; (O)
    select min(no), name, sum(price) from examples group by name; (O)
    select no, name, sum(price) from examples group by no, name; (O)
    

    GROUP BY에서 지정한 열 이외의 열은 집계함수를 사용하지 않은채 SELECT 구에 기술 할 수 없다.


    GROUP BY 결과값 정렬

    GROUP BY로는 실행 결과 순서를 정렬할 수 없으므로 ORDER BY 구를 사용해주면 된다.

    앞서 알아봤듯 내부처리 순서상 ORDER BY 구가 맨 나중에 처리되기 때문이다.

    select category_id, count(category_id), sum(price) from products
    group by category_id order by sum(price) desc;

    DESC 는 내림차순!! (디폴트는 ASC 오름차순 정렬이다.)

     

    출처 :

    SQL 첫걸음/ 아사이 아츠시 지음/ 한빛미디어

    728x90

    'Database' 카테고리의 다른 글

    SQL 서브쿼리_2  (0) 2021.04.14
    SQL 서브쿼리_1  (0) 2021.04.09
    SQL COUNT 집계함수  (0) 2021.03.29
    물리삭제와 논리삭제  (0) 2021.03.29
    SQL UPDATE (데이터 갱신하기)  (0) 2021.03.25
Designed by Tistory.