Oracle-グループ(GROUP BY、HAVING)


グループ関数


  • データ全体から統計結果を取得する

  • 1行または複数行をグループ化して、合計および平均値などの結果を求めます.

  • グループ関数タイプ
  • SUN, AVG, MAX, MIN, stdDEV, VARIANCE
    -NULL値を含まない
  • を計算します.
    SELECT sum(sal),        # 합계
           avg(sal),        # 평균
           max(sal),        # 최대값
           min(sal),        # 최소값
           stddev(sal),     # 표준편차
           variance(sal)    # 분산
    FROM emp;
    
     -> 
       SUM(SAL)   AVG(SAL)   MAX(SAL)   MIN(SAL) STDDEV(SAL) VARIANCE(SAL)
    ---------- ---------- ---------- ---------- ----------- -------------
         25335    2111.25       5000        950  1186.23569    1407155.11
         
  • COUNT
    -戻りテーブルのロー数
  • * NULL 값을 제외하고 개수를 셈 - COUNT(특정칼럼명)
    SELECT count(comm) 
    FROM emp;
     ->
    COUNT(COMM)
    -----------
              4
              
    * NULL 값을 포함하고 개수를 셈 - COUNT(*)
    SELECT count(*) 
    FROM emp;
     ->
    COUNT(*)
    ----------
            12

    GROUP BYセクション


  • 必要なグループにデータをグループ化

  • 特定の列に基づいてグループ化する必要があります

  • 特定の列に基づいて和を求めるために使用される(sum、avg、countなど)

  • SELECTセクションでグループ化されていない関数の列を使用すると、グループ化された結果とグループ化されていない結果との数の違いにより、一致できなくなり、エラーが発生します.

  • 形式
  • SELECT 컬럼명, 그룹함수
    FROM 테이블명
    WHERE 조건 (연산자)
    GROUP BY 칼럼명;
  • SELECT DEPTNO, JOB, COUNT(*), SUM(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB;   # DEPTNO와 JOB을 그룹으로 묶음
    
     ->
        DEPTNO JOB                  COUNT(*)   SUM(SAL)
    ---------- ------------------ ---------- ----------
            20 CLERK                       1       1210
            30 SALESMAN                    4       5600
            20 MANAGER                     1       2975
            30 CLERK                       1        950
            10 PRESIDENT                   1       5000
            30 MANAGER                     1       2850
            10 CLERK                       1       1300
            10 MANAGER                     1       2450
            20 ANALYST                     1       3000
            
    # DEPTNO와 JOB을 기준으로 하나의 그룹으로 만들어 해당 그룹의 집계(COUNT, SUM)를 계산해서 출력

    HAVING節


  • GROUP BYを使用してグループを作成し、HAVINGを使用してグループの結果を自動的に制限できます.

  • WHEREセクションなどの条件をグループに追加

  • 出力条件がTrueの結果のみ
  • SELECT DEPTNO, JOB, COUNT(*), SUM(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
    HAVING MAX(SAL) >= 3000;    # 그룹으로 나눈 값에서 SAL의 가장 큰 값이 3000이상인 데이터만 출력
    
     ->
        DEPTNO JOB                  COUNT(*)   SUM(SAL)
    ---------- ------------------ ---------- ----------
            10 PRESIDENT                   1       5000
            20 ANALYST                     1       3000
    **を参照
  • 聖潤静《データベース性能の最適化Oracle 11 gプログラミング》,北思科(2011)