GROUP BY, HAVING 절

집계 함수

-> 여러 행들이 모여 하나의 결과를 돌려주는 함수

  1. 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
  2. GROUP BY 절은 행들을 소그룹화 한다.
  3. SELECT 절, HAVING 절, ORDER BY 절에 사용할 수 있다.
집 계 함수명 ( DISTINCT/ALL 칼럼이나 표현식 )
  1. ALL Default 옵션이므로 생략 가능함
  2. DISTINCT : 같은 값을 하나의 데이터로 간주할 때 사용하는 옵션임

  • 일반적으로 group by절과 같이 사용 되나 테이블 전체가 하나의 그룹이 되는 경우 Group by 절 없이 사용 가능
SELECT COUNT(* ) from TMP

GROUP BY 절

-> 데이터들을 작은 그룹으로 분류하여 소그룹에 대한 항목별로 통계 정보를 얻을 때 추가로 사용된다.

  1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  3. GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.
  4. 집계 함수는 WHERE 절에는 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다)
  5. WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.
  6. HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
  7. GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
  8. HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.
오류SELECT POSITION 포지션, AVG(HEIGHT)평균키 FROM PLAYER;
정상SELECT POSITION 포지션, AVG(HEIGHT)평균키 FROM PLAYER GROUP BY POSITION ;
  • GROUP BY 절에서는 ALIAS 사용 불가

HAVING 절

-> HAVING 절에 맞는 조건을 출력하여 주는 것으로 보통 GROUP BY 절 뒤에 서술(순서를 바꾸어도 상관은 없음)



{info}주의 할 점은 WHERE 절의 조건 변경은 대상 데이터의 개수가 변경되므로 결과 데이터 값이 변경될 수 있지만, HAVING 절의 조건 변경은 결과 데이터 변경은 없고 출력되는 레코드의 개수만 변경될 수 있다. {info}

CASE 표현을 활용한 월별 데이터 집계

-> "집계 함수(CASE( ))~GROUP BY" 기능은 모델링의 저11정규화로 인해 반복되는 칼럼의 경우 구분 칼럼을 두고
여러 개의 례코드로 만들어진 집합을, 정해진 칼럼 수만큼 확장해서 집계 보고서를 만드는 유용한 기법이다.



집계 함수와 NULL 처리

-> 다중 행 함수를 사용 하는 것은 불필요한 부하가 발생하고 연산시 Null에 대한 부분을 함수에서 제외 하므로 다중행 함수안에서는 NVL/ISNULL 사용이 불필요
NULL값을 0으로 변경 등으로 사용하고자 한다면 다중행 함수 바깥에서 사용하면 원하는 값을 볼 수 있다.

{tip}simple_case_expressiondecode문과 유사SELECT deptno, case deptno when 10 then 'ACCOUNTING' when 30 then 'SALES' else 'ETC' end as dept from emp
searched_case_expressionif..then..else문과 유사, when 절 다음에 여러가지 조건 가능SELECT deptno, case when deptno = 10 then 'ACCOUNTING' when deptno = 30 then 'SALES' else 'ETC' end as dept from emp

문서에 대하여