티스토리 뷰

Oracle SQL/SELECT

오라클(Oracle) SQL 07_SELECT(그룹함수)

justgodoit 2024. 7. 18. 17:46

목차

    그룹함수의 종류

    N개의 값을 읽어듥여 1개의 결과를 반환하는 함수이다. 하나 이상의 행을 그룹으로 묶어 연산하여 하나의 결과로 나타낸다. 그룹 함수는 null을 제외하고 계산한다.

    SUM ( NUMBER )

    전달된 컬럼값들의 총 합계를 구해 NUMBER 타입으로 반환, 컬럼 값들의 총 합계를 구한다. 

    -- 전체 사원의 급여 합계를 구한다.
    SELECT SUM(SAL)
     FROM EMP;
    -- 전 사원의 총 급여
    SELECT SUM(SALARY)
     FROM EMPLOYEE;
    -- 남자 사원들의 총 급여합
    SELECT SUM(SALARY)
     FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1) IN ('1', '3');
    -- 부서코드가 D5인 사원들의 총 연봉 합
    SELECT SUM(SALARY*12)
     FROM EMPLOYEE
    WHERE DEPT_CODE = 'D5';

    AVG ( NUMBER )

    전달된 컬럼값들의 평균을 구해 NUMBER 타입으로 반환, 컬럼 값들의 평균 값을 구한다.

     -- 전체 사원의 평균급여
    SELECT SUM(SALARY) / 23
         , AVG(SALARY)
         , TO_CHAR( ROUND ( AVG(SALARY) ), 'L999,999,999' )
      FROM EMPLOYEE;

    2.  SELECT SUM (SALARY) / 23  >> 총 23개의 SALARY가 더해진다.

                      ,  AVG (SALARY)  >> SALARY의 평균 값을 반환하며 값이 소숫점이 많아 지저분하게 보일 수 있다.

                      ,  TO_CHAR ( ROUND ( AVG(SALARY) ) , 'L999,999,999' ) >> ROUND 함수(숫자만)를 통해 반올림처리해서 3047663로 반환 할 수 있다. 추가로 원화 표시를 하고 싶은 경우 TO_CHAR 함수로 묶은 후 ' L999,999,999 ' 와 같이 포맷을 작성해서 3,047,663으로 반환할 수 있다.

     

    1.    FROM  EMPLOYEE;  >> EMPLOYEE 테이블의 ~

    MIN ( ANY )

    (ANY) 어떠한 값이든 가능하다. 문자면 문자, 데이터면 테이터, 이 후 전달된 컬럼값들 중 최소값을 구해 해당 타입으로 반환한다.

    SELECT MIN(EMP_NAME)
         , MIN(SALARY)
         , MIN(HIRE_DATE)
      FROM EMPLOYEE;

    2.  SELECT  MIN (EMP_NAME)  >> EMP_NAME(이름) 중 최솟값(가장 작은 값)을 반환한다.

                      ,  MIN (SALARY)  >> SALARY(급여) 문자열 타입 최솟값(가장 작은 값) 을 반환한다. 

                      ,  MIN (HIRE_DATE)  >> HIRE_DATE(입사일) 중 최솟값(가장 작은 값) 을 반환한다.

     

    1.    FROM  EMPLOYEE;  >> EMPLOYEE 테이블의 ~

    MAX ( ANY )

    (ANY) 어떠한 값이든 가능하다. 문자면 문자, 데이터면 테이터, 이 후 전달된 컬럼값들 중 최대값을 구해 해당 타입으로 반환

    SELECT MAX(EMP_NAME)
         , MAX(SALARY)
         , MAX(HIRE_DATE)
      FROM EMPLOYEE;

    2.  SELECT  MAX (EMP_NAME)  >> EMP_NAME(이름) 중 최댓값(가장 큰 값)을 반환한다.

                      ,  MAX (SALARY)  >> SALARY(급여) 문자열 타입 최댓값(가장 큰 값) 을 반환한다. 

                      ,  MAX (HIRE_DATE)  >> HIRE_DATE(입사일) 중 최댓값(가장 큰 값) 을 반환한다.

     

    1.    FROM  EMPLOYEE;  >> EMPLOYEE 테이블의 ~

    COUNT ( * | [ DISTINCT ]  ANY )

    전달된 행의 갯수 | 컬럼 값의 갯수를 세서 NUMBER 타입으로 반환, 행의 개수를 반환한다. 조회된 결과의 모든 행 갯수를 세서 반환한다.

     

    • COUNT ( * )
    • COUNT ( 컬럼명 )
    • COUNT ( DISTINCT 컬럼명 )

    COUNT ( * )

    -- EMPLOYEE 테이블의 전체 사원을 조회
    SELECT COUNT(*) 
     FROM EMPLOYEE;
    -- EMPLOYEE 테이블의 여자 사원수를 조회
    SELECT COUNT(*)
     FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1) IN('2', '4'); -- 8명

    1. FROM EMPLOYEE

    : 조회하고자 하는 테이블 명은 EMPLOYEE이다.

     

    2. WHERE SUBSTR(EMP_NO, 8, 1)

    : 조건식이며, SUBSTR을 사용한다. SUBSTR을 통해 EMPLOYEE 테이블에 있는 EMP_NO 컬럼의 8번째 글자부터 1개를 잘라온다. (8번째는 주민등록번호 8번째 자리이기 때문에 잘라오는 것)

    3. IN('2', '4');

    WHERE절에서 'IN' 키워드는 OR조건과 같은 의미로 코드를 간략하게 줄여주는 키워드로 예시를 들면 아래와 같다.

    번호 이름 주민등록번호
    1 홍길동 1234567-2234567
    2 홍길순 1234567-1234567
    3 고길동 1234567-4234567

     

    위와 같은 표에서 WHERE SUBSTR(EMP_NO, 8,1) IN('2','4') 를 실행할 경우 8번째 글자 첫번째에 '2'인 글자와 '4'인 글자를 충족하는 1번과 3번에 있는 데이터를 추출한다.

     

    COUNT ( 컬럼명 )

    조회된 컬럼의 값들을 갯수를 세서 반환 (단, NULL은 제외)

    -- 여자 사원들 중에서 보너스를 받는 사원의 수
    SELECT COUNT(*)
     FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1) IN('2', '4')
      AND BONUS IS NOT NULL; -- 4명

    3. SELECT  COUNT ( * )                        >> 조회 컬럼의 값들의 갯수를 세서 반환한다.

    1.    FROM  EMPLOYEE                       >> EMPLOYEE 테이블의

    2.  WHERE SUBSTR(EMP_NO , 8 , 1 )  >> EMP_NO 컬럼의 8번째부터 첫번째 글자가

                 IN ( ' 2 ' , ' 4 ' )                           >> ' 2 ' 또는 ' 4 '  인 경우와

             AND BOUNS  IS NOT NULL;       >> 그리고(AND) 보너스 컬럼 데이터가 NULL이 아닌(IS NOT NULL)을 반환한다. 

     

    또는 아래와 같은 방법으로도 구현이 가능하다.

    SELECT COUNT(BONUS)
     FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1) IN('2', '4'); -- 4명 

    3. SELECT  COUNT ( BONUS )            >> BONUS 컬럼의 조회된 값들의 갯수를 세서 반환한다.

    1.     FROM  EMPLOYEE                       >> EMPLOYEE 테이블의

    2.  WHERE SUBSTR(EMP_NO , 8 , 1 )  >> EMP_NO 컬럼의 8번째부터 첫번째 글자가

                   IN ( ' 2 ' , ' 4 ' )                           >> ' 2 ' 또는 ' 4 '  인 경우

    -- 부서배치를 받은 사원수 조회
    SELECT COUNT(DEPT_CODE)
     FROM EMPLOYEE;

    2. SELECT  COUNT(DEPT_CODE)           >> DEPT_CODE 컬럼의 조회된 값들의 갯수를 세서 반환한다.
    1.     FROM  EMPLOYEE                            >> EMPLOYEE 테이블의 ~

     

    COUNT ( DISTINCT 컬럼명 )

    DISTINCT

    DISTINCT란 테이블에서 중복된 데이터를 제거하고 고유한 값을 반환하는 SQL 명령어이다. DISTINCT를 사용하면 쿼리문을 분석할 때 중복을 제거한 결과가 반환된다는 것을 직관적으로 파악할 수 있다. 하지만 DISTINCT 를 사용하면 temp tablespace에 임시로 저장 후 작업하는 방식이라서 시스템에 부하가 발생할 수도 있다.

    -- 현재 사원들이 총 몇개의 부서에 분포되어있는지
    SELECT COUNT(DISTINCT DEPT_CODE) -- 6
      FROM EMPLOYEE;

    2. SELECT  COUNT ( DISTINCT DEPT_CODE )   >> DEPT_CODE 컬럼의 중복된 값을 제거한 후 조회된 값들을 갯수를 세서 반환한다.

    1.     FROM  EMPLOYEE                                         >> EMPLOYEE 테이블의 ~

    ※ NULL인건 세어지지 않음

    SELECT COUNT(DISTINCT NVL(DEPT_CODE, '없음')) -- 7
      FROM EMPLOYEE;

    2. SELECT  COUNT ( DISTINCT DEPT_CODE )   >> DEPT_CODE 컬럼의 중복된 값을 제거한 후 조회된 값들을 없음도 포함해서 갯수를 세서 반환한다.

    1.     FROM  EMPLOYEE                                         >> EMPLOYEE 테이블의 ~