본문 바로가기

Database/SQL

[코테를 위한 Oracle 정리] 7. 그룹핑 : GROUP BY, HAVING

손에 잡히는 10분 SQL 10장 참고

GROUP BY

SELECT vend_id, COUNT(*) as num_prods
FROM PRODUCTS
GROUP BY vend_id

 

  • vend_id가 같으면 count 값도 증가한다.
  • 해당 vend_id의 제품이 몇 개 있는 지를 알 수 있다.

특징

  • 데이터를 GROUP BY 뒤에 오는 열을 기준으로 그룹핑 한 후 계산한다
  • 중첩(nested) 그룹을 만들기 위해서는 GROUP BY 뒤에 원하는 만큼 열을 적으면 된다
    • 마지막에 지정된 그룹에서 요약된다
  • GROUP BY 절에 쓸 수 있는 열
    • 그룹함수는 안 됨
    • 별칭 사용 불가
    • SELECT 에 수식을 사용했다면 GROUP BY에서도 똑같이 써줘야 한다
  • 그룹 함수를 제외하고는 SELECT 에 있는 열은 GROUP BY에도 존재해야 한다
  • NULL 값도 그룹으로 가져와진다
  • 작성 순서 : WHERE -> GROUP BY -> HAVING ->ORDER BY
  • SELECT에서 가져온 열의 순서로 GROUP BY에서 열을 지정할 수 있다
    • ex) GROUP BY 2,4

 

  •  

그룹 필터링 : HAVING

HAVING은 그룹핑한 결과를 기반으로 필터링할 수 있게 해준다
WHERE과 유사한 기능을 하지만 WHERE은 행을 필터링하고, HAVING은 그룹을 필터링 한다. 그래서 WHERE에서의 문법과 옵션을 HAVING에서도 똑같이 사용할 수 있다.

 

SELECT cust_id, COUNT(*) as orders
FROM ORDERS
GROUP BY cust_id;

여기에 HAVING만 추가해보았다.

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

이렇게 HAVING은 그룹핑된 이후에 필터링을 한다.

 

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

이렇게 where 과 having을 둘 다 사용해야 할 경우도 있다.