C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]5. 그룹 함수를 사용한 데이터 집계 본문

Programming/Oracle 공부

[Oracle/기본]5. 그룹 함수를 사용한 데이터 집계

19760323 2017. 5. 22. 16:46

 

● 그룹함수(집계함수)란?

  

  단일 행 함수와는 달리 그룹 함수는 그룹 당 하나의 결과가 주어지도록 행의 집합에 대해 연산한다.

  이러한 집합은 전체 테이블이거나 특정 그룹일 수 있다.

  그룹함수는 열에 있는 null값을 무시한다.

  null값을 포함하게 하고 싶으면, NVL함수를 쓰면 된다. (AVG그룹함수 설명에서 참고.)

 

- AVG

 입력된 데이터의 평균을 구하는 함수.

 

 Ex. AVG(sal)

     sal 컬럼의 평균을 구한다. (NULL값 미포함)

     AVG(NVL(sal, 0))

     sal 컬럼의 평균을 NULL값의 경우 0으로 치환하여 구한다.    

     

 

- MIN(sal), MAX(sal)

  모든 데이터형에 대해서 MIN과 MAX가 가능하다.

 

  ☞ sal이 Date형일 경우

     최근 날짜 : MAX

     이전 날짜 : MIN

  ☞ sal이 문자열일 경우

      A에 가까울수록 MIN

      Z에 가까울수록 MAX

 

- COUNT

   테이블 행의 수 리턴

 

   ☞ COUNT(*) : NULL값 포함 결과

   ☞ COUNT(col) : NULL값 제외한 결과

 

 

● GROUP BY

    테이블의 그룹으로 나눈다.

  

- SELECT절에 그룹 함수를 포함한다면, GROUP BY 절그룹함수가 아닌 각각의 열이 명시되어야 한다.

- WHERE절을 사용하여 행을 그룹으로 나누기 전에 미리 행을 제외시킬 수 있다.

- GROUP BY 절에 열을 포함해야 한다.

- GROUP BY 절에 열 별칭은 사용할 수 없다.

- 기본적으로, 행들은 GROUP BY 목록에 포함된 열의 오름차순 정렬로 저장된다.

   ORDER BY 절을 사용하여 이것을 변경할 수 있다.

- GROUP BY절을 사용할 때, 그룹 함수에 포함되지 않는 SELECT 절의 모든 열들은 GROUP BY절에 포함되야한다.

  

  Ex.    SELECT deptno, AVG(sal)                                     DEPTNO  AVG(SAL)

           FROM emp                                    →         -------------   -------------------------

     GROUP BY deptno;                                                        10   2916.6667

                                                                                      20         2175

                                                                                      30         6667

     행은 부서번호에 의해 그룹화 되어 있으므로, 급여 열에 적용된 AVG함수는 각각의 부서에 대한 평균 급여이다.

     ->GROUP BY 절은 행을 GROUPING 한다.

 

- WHERE절을 사용하여 그룹을 제한할 수 없다.

  그룹을 제한 하기 위해서 HAVING 절을 사용해야 한다.

 

   Ex.     SELECT deptno, AVG(sal)                                  SELECT deptno, AVG(sal)

             FROM emp                                                   FROM emp

           WHERE AVG(sal) > 2000                   →         GROUP BY deptno

      GROUP BY deptno;                                              HAVING AVG(sal) > 2000;

☞ HAVING 절은 GROUP BY절 앞에 올 수 있지만, GROUP BY 절을 먼저 두는 게 더 논리적이므로 권장된다. HAVING 절이 SELECT 절에 있는

    그룹에 적용되기 전에 그룹은 구성되고 그룹 함수는 계산된다.

 

* HAVING 절

  • - WHERE 절에서는 그룹함수를 사용 할 수 없다.
  • - HAVING 절그룹함수를 가지고 조건비교를 할 때 사용한다.
  • - HAVING절은 GROUP BY절과 함께 사용이 된다.

● 중첩 그룹 함수

    그룹 함수는 어떤 레벨까지라도 중첩할 수 있다.

 

Ex. 최대 평균 급여

 

     SELECT MAX(AVG(sal))

       FROM emp

 GROUP BY deptno

☞ deptno로 그룹화면 sal의 평균 값들중 최댓값을 구한다.

 

 

 

 

 

 

 

 

 

Comments