[SQL] 데이터 그룹핑

CC·2022년 10월 18일
0

데이터 그룹핑 이해하기

  • 그룹핑은 데이터를 논리적으로 나눠주기 때문에 각 그룹에 대한 집계 연산을 수행할 수 있다.

그룹 생성하기: GROUP BY 절

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
-- GROUP BY 절에게 vend_id로 그룹핑하고 데이터를 정렬하라고 명령한다.

GROUP BY 절을 사용하면 자동으로 각 그룹에 대해 계산하기 때문에, 계산할 그룹을 따로 명시할 필요가 없다.
GROUP BY 절은 DBMS에게 먼저 데이터를 그룹핑한 후, 각각의 그룹에 대해 계산하라고 지시한다.

규칙

  • GROUP BY 절에는 원하는 만큼의 열을 써서, 중첩(nested) 그룹을 만들 수 있다. 이 방식은 데이터를 그룹핑하는 방식을 좀 더 세밀하게 제어할 수 있게 해준다.
  • GROUP BY 절에 중첩된 그룹이 있다면, 데이터는 마지막으로 지정된 그룹에서 요약된다. 즉, 지정된 열은 그룹핑할 때 같이 측정된다.
  • GROUP BY 절에 있는 열은 가져오는 열이거나, 그룹 함수는 아니면서 유효한 수식이어야 한다. SELECT 절에서 수식을 사용한다면, GROUP BY 절에도 같은 수식을 사용해야 한다. 별칭은 사용할 수 없다.
  • 대부분의 SQL 실행 환경에서는 GROUP BY 절에서 문자나 메모와 같은 가변형 길이의 데이터형은 사용할 수 없다.
  • 그룹 함수 명령문을 제외하고 SELECT절에 있는 모든 열은 GROUP BY 절에 존재해야 한다.
  • 그룹핑하는 열의 행에 NULL 값이 있다면, NULL도 그룹으로 가져온다.
    여러 행이 NULL값을 가진다면, 모두 함께 그룹핑된다.
  • GROUP BY 절은 WHERE 절 뒤에, ORDER BY 절 앞에 와야 한다.

그룹 필터링: HAVING 절

WHERE 절의 모든 유형은 HAVING 절에서도 사용이 가능하다.
차이점은 WHERE 절은 행을 필터링하고, HAVING 절은 그룹을 필터링한다.
WHERE 절은 데이터가 그룹핑되기 전에 필터링하고, HAVING 절은 데이터가 그룹핑된 후에 필터링한다.
GROUP BY 절이 있을 때만 HAVING 절을 사용하고, 행 단위로 필터링 할때는 WHERE 절을 사용하자!

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

-- Products 테이블에서 가격이 4달러 이상인 제품을 2개이상 가진 판매처를 가져와라
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING count(*) >= 2;

그룹핑과 정렬

ORDER BYGROUP BY
결과를 정렬한다.행을 그룹핑한다. 결과는 그룹 순서대로 출력되지 않을 수 있다.
가져오지 않은 열이라도 사용할 수 있다.선택된 열이나 수식만 사용할 수 있고, 선택된 열이나 수식을 꼭 사용해야 한다.
필수 항목은 아니다.그룹 함수와 함께 사용하는 열(또는 수식)이 있는 경우 필수 항목이다.

GROUP BY 절을 사용할 때마다 ORDER BY 절을 명시해야 한다.
그렇게 해야 데이터가 제대로 정렬되었다고 확신할 수 있다.

-- Orderitems 테이블에서 세 개 이상의 제품을 주문한 경우의 주문 번호와 주문 수량을 항목 수로 정렬하여 가져와라.
SELECT order_num, COUNT(*) AS items
FROM Orderitems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

✔️ SELECT문 순서
SELECT 가져올 열이나 순서
FROM 데이터를 가져올 테이블
WHERE 행 레벨 필터링
GROUP BY 그룹 지정
HAVING 그룹 레벨 필터링
ORDER BY 정렬 순서

0개의 댓글