DB

[DB/기본] 그룹함수

hhaeri 2020. 12. 30. 12:26

그룹 함수 : 테이블 전체 행을 하나 이상의 컬럼을 기준으로 그룹화하여 그룹별로 결과를 출력하는 함수이다. (통계를 낼 때 주로 사용한다.)

 

1. 종류

종류

의미

사용

특징

AVG

평균

AVG(컬럼)

NULL 은 제외

COUNT

개수

COUNT(컬럼 | *)

COUNT(column) 또는 COUNT(*), NULL 은 제외

MAX

최대값

MAX(컬럼)

NULL 은 제외

MIN

최소값

MIN(컬럼) 

NULL 은 제외

SUM

합계

SUM(컬럼)

NULL 은 제외

STDDEV

표준편차

STDDEV(컬럼)

NULL 은 제외

VARIANCE

분산

VARIANCE(컬럼)

NULL 은 제외

 

2. GROUP BY

 1) 특징

   - 특정 컬럼값을 기준으로 전체 레코드(ROW)를 서브 그룹으로 그룹화 한다.

   - 통계를 낼 때 주로 사용한다.

   - GROUP BY 절에 명시하지 않은 컬럼은 그룹함수와 함께 사용할 수 없다.

   - 여러 컬럼을 사용하여 다중 그룹화를 할 수 있다.

 

 2) 작성 규칙

  - ALIAS는 사용할 수 없다.

  - 그룹화 된 컬럼은 기본적으로 오름차순으로 출력된다.

  - SELECT절에 나열된 컬럼은 GROUP BY 절에서 반드시 명시해야한다.

  - GROUP BY 절에서 명시한 컬럼을 SELECT 절에서 사용하지 않아도 된다.

SELECT 컬럼1 COUNT(*) FROM 테이블_이름
GROUP BY 컬럼1;

3. ROLLUP

 - GROUP BY 절의 컬럼을 기준으로 그룹화를 진행하고 각 그룹에 대해 부분합을 구한다.

--예제 : 소속 부서별로 직원 급여 합계와 모든 부서 직원들의 급여 합계를 출력.

SELECT deptno, SUM(sal) FROM  DEPT 
GROUP BY ROLLUP(deptno);

4. CUBE

 - ROLLUP에 의한 그룹 결과와 GROUP BY 절 조건에 따라 그룹 조합을 만든다.

 - 그룹화된 컬럼이 가질 수 있는 모든 경우의 수에 대해서 소계(SUBTOTAL), 총계(GRAND TOTAL)을 출력한다.

--예제 : 학과 및 직급별 교수 수, 학과별 교수 수, 직급별 교수 수, 전체 교수 수를 출력하여라.

SELECT deptno, position, COUNT(*)

     FROM  professor

     GROUP BY CUBE(deptno, position);

5. HAVING

 - GROUP BY 절에 의해 생성된 그룹에 조건을 지정한다.

 - HAVING 절 : 이미 그룹화 된 결과를 대상으로 조건을 지정한다.

 - WHERE 절 : 그룹화 전에 먼저 조건을 지정한다.

  * GROUP BY전에 불필요한 레코드를 미리 제외할 수 있기 때문에 WHERE 절을 사용하는 것이 더 효율적이다.

SELECT 컬럼, 그룹함수(컬럼)
	FROM 테이블_이름
WHERE 조건식
	GROUP BY 컬럼
	HAVING 그룹 조건식;

6. GROUPING SETS

 - GROUP BY 절에 여러개의 그룹 조건을 작성할 수 있다.

 -  GROUPING SETS 함수의 결과는 각 그룹 조건에 대해 별도로 GROUP BY한 결과를 UNION ALL한 결과와 동일하다.

SELECT deptno, job, SUM(sal) 
FROM emp
GROUP BY GROUPING SETS(deptno,job);

7. GROUPING

 - ROLLUP,CUBE,GROUPING SETS 가 사용되면 GROUPING(표현식) =1, 사용되지 않으면 GROUPING(표현식) =0 으로 출력된다.

SELECT DNAME 
          , GROUPING(DNAME)
          , JOB
          , GROUPING(JOB)
          , COUNT(*)
          , SUM(SAL)
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO                                                                                                                                            
 GROUP BY ROLLUP( DNAME, JOB )
 ORDER BY DNAME, JOB;