5월 21일 금요일 (9일차) - 그룹함수ㅇ

@_@·2021년 5월 21일
0

Database

목록 보기
18/28

<목차>

ㅇ 그룹 함수

  • AVG
  • SUM
  • MIN
  • MAX
  • COUNT



ㅇ 함수란?

  • 예) sum은 100, 200, 100, 200 이 4개를 다 받아들이고
    계산식을 갖고 있어서 100+200+100+200 = 600 이라는 하나의 결과가 나오는 것
  • 하나 또는 다수의 값(인수)을 받아들여 함수 자체가 갖고 있는 계산식을 통해 수행해서
    1개의 결과를 return 시켜주는 것



ㅇ 그룹 함수

  • 행 집합에 작용하여 그룹 당 하나의 결과를 생성(return)
  • 그룹 : 받아들이는 데이터의 범위
    • 사용자가 지정한 그룹별로 리턴
    • 테이블의 전체 데이터를 받아들일 수도 있지만 내가 원하는 특정 그룹별로도 처리할 수 있어
  • AVG : 평균
  • COUNT : 개수
  • MAX : 최댓값
  • MIN : 최솟값
  • STDDEV : 표준편차
  • SUM : 합계
  • VARIANCE : 분산
  • NULL 값을 무시한다.★ (COUNT(*) 제외)
    • 항상 NULL 값 신경 쓰기
  • 표준편차와 분산은 잘 사용 안 해
SELECT AVG(받아들일 인수값의 컬럼이름), SUM(받아들일 인수값의 컬럼이름)
       MIN(받아들일 인수값의 컬럼이름), MAX(받아들일 인수값의 컬럼이름)
FROM 컬럼을 소유한 테이블
WHERE 조건식

ㅇ AVG(salary) : 평균 / SUM(salary) : 합

  • 숫자 데이터만 가능
    • 산술연산을 계산식으로 가지고 하기 때문에
  • 문자, 날짜는 에러나 (예.입사일의 총합이 의미가 없잖아.)
  • WHERE절을 이용해서 조건 추가
SELECT AVG(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%'

업무이름에 REP 있는 사람들의 급여 평균과 합을 구하여라.


ㅇ MIN, MAX 함수

  • 모든 데이터 유형에 사용 가능
    • 최소, 최대의 기준이 아스키코드라서
  • 예) 숫자
SELECT MIN(salary), MAX(salary)
FROM employees
SQL> /
MIN(SALARY) MAX(SALARY)
----------- -----------
       2100       24000

최저급여 / 최대급여

  • 예) 날짜
SELECT MIN(hire_date), MAX(hire_date)
FROM employees
SQL> /
MIN(HIRE_DATE) MAX(HIRE_DATE)
--------       --------
01/01/13       08/04/21

가장 먼저 입사한 사원(가장 오래된) / 가장 마지막에 입사한 사원(가장 최근)

  • 예) 이름
SELECT MIN(last_name), MAX(last_name)
FROM employees
SQL> /
MIN(LAST_NAME)  MAX(LAST_NAME)
--------        --------
Abel            Zlotkey

알파벳 순서 맨 앞 / 맨 뒤



ㅇ NULL 처리에 관한 주의점

  • AVG, SUM, MIN, MAX, COUNT(컬럼)은 NULL을 무시

    • 컬럼을 인수로 하여 컬럼에 있는 데이터 '값'을 받아들이기 때문에
  • COUNT(*)는 NULL 포함

    • 행으로 값을 받아들여
  • 실험 ) 평균 = 총합/사람수 인지 확인해보기 위해

SELECT AVG(commission_pct), SUM(commission_pct)
FROM employees
SQL> /
AVG(COMMISSION_PCT)   SUM(COMMISSION_PCT)/107 
------------------    ----------------------
        .222857143                  .072897196
  • AVG : 보너스 받는 35명으로 나눈 것 (NULL 제외)
  • SUM/107 : 보너스 안 받는 사람 포함한 전체 107명으로 나눈 것
  • 즉, null 있는지 모르고 사용하면 의도와 다른 결과 나올 수 있어
  • 전체 107명의 평균을 구하려면?
    • 널을 살리는 NVL함수 사용. 함수 중첩시켜
SELECT AVG(NVL(commission_pct,0)), SUM(commission_pct)/107
FROM employees
SQL> /
AVG(NVL(COMMISSION_PCT,0)) SUM(COMMISSION_PCT)/107
-------------------------- -----------------------
                .072897196              .072897196
  • 중첩함수
    • 안에 있는 함수가 먼저 실행돼
    • AVG(NVL(COMMISSION_PCT,0))
      • NVL 먼저 실행 : 보너스 NULL인 사람을 0으로 대체
      • 이제 NULL 없으니 107명으로 평균 구할 수 있게 돼


ㅇ COUNT 함수

  • 출력되는 행의 개수를 반환
  • WHERE절 먼저 실행되고, 이 조건에 맞는 행들만 그룹 함수 적용
  • COUNT(*) : 테이블의 행의 개수를 반환
    • 널 값, 중복 행 포함
SELECT COUNT( * )
FROM employees
WHERE department_id = 50
SQL> /
  COUNT(*)
----------
        45
  • 의미 : 50번 부서에 근무하는 사원의 수가 45명이다
  • COUNT(컬럼이름) : 컬럼의 행의 개수 반환
    • 널이 아닌 행 수 반환
SELECT COUNT(commission_pct)
FROM employees
SQL> /
COUNT(COMMISSION_PCT)
---------------------
                   35
  • 의미 : 보너스를 받는 사원의 수
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80
SQL> /
COUNT(COMMISSION_PCT)
---------------------
                   34
  • 의미 : 80번 부서에서 보너스 받는 수 : 34
  • 와우! 전체 35명 중에서 34명이 이 부서에 있네..
    이런 부서에서 일을 해야겠네 ㅋㅋ


ㅇ DISTINCT 키워드 사용

  • 중복된 값을 제거하고 개수를 세라
  • COUNT뿐만 아니라 그룹함수 전체에 사용 가능한가 봐 (수업시간엔 COUNT로 했음)
  • 셀렉트에서 사용되는 DISTINCT 와의 차이점
    • 셀렉트에서 : 디스팅트는 셀렉트 리스트 절에 의해 '출력'되는 데이터에서 중복이 제거되는 것
    • 그룹함수에 : 사용되는 디스팅트는 값을 '받아들일 때' 중복을 제거하고 받아들여라
SELECT COUNT(DISTINCT 컬럼)
FROM 테이블
  • COUNT (컬럼) 은 사실 COUNT (ALL 컬럼) : 디폴트라서 생략되어 있던 것
  • 예) 사원이 근무하고 있는 부서번호를 세어라.
    • 부서테이블에서 번호를 세면 사원이 근무하지 않는 빈 부서까지 나오겠지
    • 그래서 사원테이블에서 검색해보려 해
SELECT COUNT(department_id)
FROM employees
SQL> /
COUNT(DEPARTMENT_ID)
--------------------
                 106
  • 106개 : 중복되는 번호 다 나와

그래서 DISTINCT를 사용하면 중복이 제거되어 옳은 결과가 나와

SELECT COUNT(DISTINCT department_id)
FROM employees
SQL> /
COUNT(DISTINCT DEPARTMENT_ID)
----------------------------
                          11
  • 실험) DISTINCT를 COUNT 앞으로 옮기면?
SELECT DISTINCT COUNT(department_id)
FROM employees
SQL> /
COUNT(DISTINCT DEPARTMENT_ID)
----------------------------
                          106
  • COUNT 결과를 중복제거 하라고 한 거라서 의미 없어
  • 원래 COUNT 결과 그대로 나와


profile
STEP BY STEP

0개의 댓글