(SQL) 데이터 그룹핑
(GROUP BY, HAVING)

(SQL) 데이터 그룹핑하기

(SQL) 데이터 그룹핑
(GROUP BY, HAVING)



우리는 그룹핑을 통해 데이터를 요약할 수 있다.
SQL은 GROUP BY절을 통해 데이터 그룹핑을 지원한다.
HAVING 절을 이용하여 그룹핑에 조건도 추가할 수 있다.

데이터 파악에 큰 도움을 주는
데이터 그룹핑에 대해 살펴보자.

1) 그룹핑하기 : GROUP BY
2) GROUP BY절의 주요 규칙
3) 그룹 필터링 : HAVING
4) HAVING vs WHERE


✋🏾 <손에 잡히는 10분 SQL _ 인사이트> 교재를 참고해 작성한 포스팅입니다.
✋🏾 샘플데이터 다운로드 링크


1. 그룹핑하기 : GROUP BY

그룹핑은 다음과 같은 상황에서 주로 쓰인다.

  • 레코드가 종류별로 몇개가 있는지 세고 싶을 때.
  • 레코드의 총합을 종류별로 알고 싶을 때.
  • 레코드를 종류별로 집계하고, 조건에 따라 필터링하고 싶을 때.

SELECT 문에서 GROUP BY 절을 사용하여 그룹을 생성할 수 있다.

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;


위의 구문은 GROUP BY 절을 사용한 예시이다.

vend_id별로 그룹핑하고,
그룹별로 레코드의 개수를 출력했다.
(그룹 계산 함수로 COUNT 함수 사용)


2. GROUP BY 절의 주요 규칙

GROUP BY절의 주요 규칙은 다음과 같다.

  • GROUP BY 절은 자동으로 각 그룹에 대해 계산하기 때문에,
    계산할 그룹을 따로 명시할 필요가 없다.
  • GROUP BY 절은 원하는 만큼의 열을 써서,
    중첩 그룹을 만들 수 있다.
  • GROUP BY 절에 중첩된 그룹이 있다면,
    데이터는 마지막으로 지정된 그룹에서 요약된다

  • GROUP BY 절에 있는 열은 가져오는 열이거나,
    유효한 수식이어야 한다.

  • SELECT 절에서 수식을 사용한다면,
    GROUP BY 절에도 같은 수식을 사용해야 한다.

  • 그룹핑하는 열의 행에 NULL 값이 있다면,
    NULL도 그룹으로 가져온다면
    (여러 행이 NULL 값을 가진다면, 모두 함께 그룹핑된다.)
  • GROUP BY 절은 WHERE 절 뒤에,
    그리고 ORDER BY 절 앞에 와야 한다.
    • ORDER BY절은 항상 구문 마지막에 사용하자
    • GROUP BY절은 데이터 정렬이 안될 때도 많다.
      따라서 정렬을 원한다면 ORDER BY를 이용하자.


3. 그룹 필터링 : HAVING

SQL은 데이터를 그룹핑하는 것 뿐만 아니라,
그룹 필터링도 가능하게 해준다.

대표적인 예로 다음과 같은 상황이 있다.

  • 최소 3번 이상 주문한 고객 리스트.
  • 총 주문금액이 30000원 이상인 고객 리스트

그룹 필터링은 HAVING 절을 이용한다.

HAVING절의 문법은 WHERE절의 문법과 동일하다.

따라서, HAVING 절은 연산자나 연산키워드를 포함하여 사용하면 된다.

연산자설명
=같다
<>같지 않다.
!=같지 않다.
<~ 보다 작다
<=~ 이하 이다.
!<~ 보다 작지 않다.
>~ 보다 크다
>=~이상 이다.
!>~ 보다 크지 않다.
BETWEEN두 개의 특정한 값 사이
IS NULL값이 NULL 이다.


GROUP BY와 HAVING 절을 이용하여
최소 3번 이상 주문한 고객 리스트를 뽑아보자.

SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;




4. HAVING vs WHERE


앞서 살펴본 것처럼,
HAVING절과 WHERE절은 데이터를 필터링할 때 사용한다.

그렇다면, 이 둘의 차이는 무엇일까?
두 절의 차이는 WHERE절은 데이터가 그룹핑되기 전에 필터링하고,
HAVING 절은 데이터가 그룹핑된 후에 필터링한다는 점이다.
WHERE 절에서 필터링되어 제거된 행은 그룹에 포함되지 않는다.

즉, WHERE 절이 행을 필터링하고 ,
HAVING 절이 그룹을 필터링한다고 이해하면 된다.

WHERE절과 HAVING절을 동시에 사용하여,
더 세부적인 필터링을 할 수 있다.

예를 들어

지난 1년동안 두 번 이상 주문한 적이 있는 고객만을 뽑아내고 싶다고 하자.

이 경우, WHERE절로 지난 1년 동안 주문했던 고객을 필터링하고,

그 다음 , HAVING 절을 이용하여 결과에서 두 번 이상 주문한 고객을 필터링하면 된다.

구문은 다음과 같다.

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2; 



대다수 DBMS에서 GROUP BY가 명시되지 않는다면,

HAVING절과 WHERE 절은 똑같이 처리한다.

하지만 디버깅과 업무효율화를 위해,
이 둘을 꼭 구별하여 사용하자.

  • 행 필터링 : WHERE
  • 그룹 필터링 : HAVING


© 2024. All rights reserved.