ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - 다중행 함수
    DataBase/Oracle 2023. 8. 30. 16:13

     

    1. 하나의 열에 출력 결과를 담는 다중행 함수 

     

      > 그룹 함수 또는 복수행 함수로 불림 

      > 여러행을 가지고 계산한 결과를 하나의 행으로 return

      > 다중행 함수를 사용한 SELECT절에는 기본적으로 여러 행이 결과로 나올 수 있는 열을 함께 사용 불가 

     

    * MYSQL과 MARIADB에선 가능 -> 가장 위에 있는 값 그냥 붙여줌 

     

    - SUM,COUNT,MAX,MIN,AVG 

       

      > SUM: null값 제외 DISTINCT 중복 제외

      > COUNT: *(null포함 행의 수 ), 특정 열(null제외), DISTINCT

      > MAX,MIN: 날짜데이터에서 날짜가 최근에 가까울 수록 큼 

      > AVG : 평균 DISTINCT 가능 

     

     *NULL값을 제외하는 특징이 있음으로, sum이나 AVG 구할 때 null처리 해야함에 유의

    2. GROUP BY절

     

    - 다중행 함수는 지정 테이블의 데이터 가공하여 하나의 결과 출력 

    - 테이블의 데이터를 그룹으로 나누면, 그룹별 결과 출력 가능 

    - GROUP BY [그룹화 열 지정(여러개)] -> 특정 열 또는 데이터 기준으로 데이터를 그룹으로 묶는다.

    - 먼저 지정한 열을 대그룹, 다음 열을 소그룹으로 나눔 

    SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
    ORDER BY DEPTNO, JOB;

     * SELECT절에 그룹바이한 절 혹은 다중행 함수 적용한 절만 사용가능 

     

    3. HAVING절 

     - HAVING절은 SELECT문에 GROUP BY절이 존재할 때 사용가능 

     - 그룹바이 결과 값의 범위를 제한하는데 사용한다. 

    SELECT DEPTNO, JOB, AVG(SAL)
    FROM EMP
    GROUP BY DEPTNO, JOB
    HAVING AVG(SAL) >= 2000
    ORDER BY DEPTNO, JOB;

    * HAVING절과 WHERE의 차이점:  - WHERE가 실행시점이 더 빠르다, WHERE절에 그룹함수로 조건  x

     

    4. 그룹화와 관련된 함수 (ROLLUP, CUBE, GROUPING SETS)

     

    - GROUP BY절에 사용할 수 있는 특수 함수이다.

     

    4.1 ROLLUP, CUBE,GROUPING SETS

     

      > 그룹화 데이터 합계 출력 시 유용하게 사용할 수 있다. 

    SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
    FROM EMP
    GROUP BY ROLLUP(DEPTNO,JOB);
    --
    SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
    FROM EMP
    GROUP BY CUBE(DEPTNO,JOB);
    
    -- 
    GROUP BY DEPTNO, ROLLUP(JOB);

    - ROULLUP함수는 명시한 열을 소그룹부터 대그룹의 순서로 각 그룹별 결과를 출력하고 마지막 총 데이터 결과 출력 

      (n -> n+1조합의 출력 a,b,c -> a,b,c 그룹별 -> a그룹별 b 그룹 결과 -> a그룹 결과-> 전체 결과 )

       - 대그룹 A 기준으로 점점 좁아짐  

      

    - CUBE함수는 지정한 모든 열에 가능한 조합을 생성합니다. 

      (n-> 2^n조합  CUBE(A,B,C) -> A그룹별 B그룹별 C그룹 -> (A그룹별B, A그룹별C) -> B그룹별C -> (각A,B,C그룹 결과)-> 전체 데이터 결과)

     

    * 그룹이 늘어날 수록 수가 기하급수적으로 늘어남 따라서 필요한 조합(보고싶은 조합만) ROLLUP, CUBE도 가능 

       이를 분할 롤업,큐브라고 함 

    * 처음에 사용하기 어렵다. -> 일단 그룹으로 나누고 ROLLUP,CUBE를 조금씩 적용해보자 

     

    - GROUPING SETS 함수 같은 수준의 그룹화 열이 여러 개 일때, 각 열별 그룹화를 통해 결과 값 출력

      > 앞선 함수들은 대그룹,소그룹이 나뉘어져 있었지만, 위 함수는 지정한 모든 열이 각각 대그룹으로 처리됨 

    SELECT DEPTNO, JOB, COUNT(*)
    FROM EMP
    GROUP BY GROUPING SETS(DEPTNO, JOB)
    ORDER BY DEPTNO,JOB;

     > 지정 열이 계층적으로 분리되는 것이 아니라, 각각 그룹화되어 연산 결과 수행

     

    4.2 그룹화 함수 (GROUPING, GROUPING_ID -> SELECT절에서 사용)

     

     - 데이터 가공, 연산 수행하지 않음 -> 그룹화 데이터 식별, 가독성 높이기 위한 목적 

     

    - GROUPING 함수 

      > ROLLUP이나, CUBE함수에서 사용한 그룹바이절에 그룹화 대상 열에 적용

      > 그룹화된 상태로 결과가 집계되었는지 확인하는 데 사용함

    SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL), GROUPING(DEPTNO), GROUPING(JOB)
    FROM EMP
    GROUP BY CUBE(DEPTNO, JOB)
    ORDER BY DEPTNO,JOB;

     > 각각 DEPTNO으로 그룹화되어 있으면, 0 아니면 1

                JOB으로 그룹화되어 있으면, 0 아니면 1 

     

    - GROUPING_ID 

      > 특정 열이 그룹화되었는지 출력 

      > GROUPING함수와 동일 다만, 여러열 지정 가능 

      > 그룹id함수를 사용한 결과는 그룹화 비트 벡터값으로 나타낸다.

        ex(그룹 a,b -> 비트벡터 00 -> 0,

             a로만 그룹 -> 비트벡터 01 -> 1,

             b로만 그룹 -> 비트벡터 10 -> 2,

             없음 ->            비트벡터 11 -> 3)

     

    - LISTAGG 함수 

     

      > 그룹바이절에 명시하지 않고, SELECT에 열 사용가능 

     

    SELECT DEPTNO,
           LISTAGG(ENAME,',')
           WITHIN GROUP(ORDER BY SAL DESC) AS ENAMES
           FROM EMP
           GROUP BY DEPTNO;

     >WITHIN GROUP(ORDER BY 나열할 열의 정렬기준 열))

     

    - PIVOT, UNPIVOT 함수 > 행과 열 반전 ** 필요할 때 찾아보자

    - 윈도우 함수등은 나중에 찾아보잣..

     

     

    참고자료: 오라클로 배우는 데이터베이스 입문(이지훈)

    'DataBase > Oracle' 카테고리의 다른 글

    SQL - 서브쿼리  (0) 2023.08.31
    SQL - 조인  (0) 2023.08.30
    오라클 SQL - 단일행함수  (0) 2023.08.30
    2. SQL - 조회  (0) 2023.08.29
    Seed PDB를 이용한 Pluggable 데이터 베이스 생성, 사용자 생성  (0) 2023.06.29
Designed by Tistory.