지구정복

[SQLD] 18. GROUP BY, HAVING 절 본문

자격증 정복/SQLD

[SQLD] 18. GROUP BY, HAVING 절

eeaarrtthh 2020. 11. 10. 09:15
728x90
반응형

1. 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 절 뒤에 서술(순서를 바꾸어도 상관은 없음)



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

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

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



마. 집계 함수와 NULL 처리

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

 

imple_case_expression decode문과 유사 SELECT deptno, case deptno when 10 then 'ACCOUNTING' when 30 then 'SALES' else 'ETC' end as dept
from emp
searched_case_expression if..then..else문과 유사, when 절 다음에 여러가지 조건 가능 SELECT deptno, case when deptno = 10 then 'ACCOUNTING' when deptno = 30 then 'SALES' else 'ETC' end as dept
from emp

 

 

 

정리

----1. 집계함수 : GROUP BY절에서 그룹을 정하고 SELECT절에서 집계함수 사용
--집계함수는 WHERE 절에 올 수 없다. / WHERE절은 GROUP 하기 전에 데이터를 제거시킨다.
--COUNT(*)      : NULL값을 포함한 행의 수 반환
--COUNT(표현식)  : 표현식의 값이 NULL인 것을 제외한 행의 수 출력
--SUM(표현식)    : 표현식의 NULL값을 제외한 합계를 출력
--AVG(표현식)    : 표현식의 NULL값을 제외한 평균을 출력
--MAX(표현식)    : 표현식의 최대값을 출력
--MIN(표현식)    : 표현식의 최소값을 출력
--STDDEV(표현식) : 표현식의 표준 편차를 출력
--VARIAN(표현식) : 표현식의 분산을 출력
SELECT COUNT(*)
FROM EMP;

----2. GROUP BY절
SELECT POSITION, ROUND(AVG(HEIGHT),3) 평균키
FROM PLAYER
GROUP BY POSITION;

----3. HAVING 절
--조건에 맞는 그룹들만 출력 / HAVING절과 GROUP BY절의 순서는 상관없다.
SELECT POSITION, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;

----4. 집계함수와 NULL처리
SELECT DEPTNO, 
    CASE WHEN DEPTNO = '10' THEN 'ACCOUNTING'
         WHEN DEPTNO = '30' THEN 'SALES'
         ELSE 'ETC'
    END AS DEPT
FROM EMP;

 

 

[출처]

wiki.gurubee.net/pages/viewpage.action?pageId=27427493

728x90
반응형

'자격증 정복 > SQLD' 카테고리의 다른 글

[SQLD] 20. 표준조인 (STANDARD JOIN)  (0) 2020.11.10
[SQLD] 19. 조인 (JOIN)  (0) 2020.11.10
[SQLD] 17. 함수 (Function)  (0) 2020.11.10
[SQLD] 16. WHERE절  (0) 2020.11.09
[SQLD] 15. TCL (Transaction Control Language)  (0) 2020.11.09
Comments