스마트인재개발원에서 배운 데이터베이스 - 복습2-2

ㅇ 본 수업은 "스마트인재개발원"에서 진행되었습니다.

https://www.smhrd.or.kr/


#스마트인재개발원 #국비지원코딩교육 #데이터베이스 #그룹함수 #AVG #SUM #MIN/MAX #COUNT




<목차>

ㅇ 그룹 함수

  • AVG
  • SUM
  • MIN
  • MAX
  • COUNT



ㅇ 함수란?

  • 하나 또는 다수의 값(인수)을 받아들여 함수 자체가 갖고 있는 계산식을 통해 1개의 결과를 return 시켜주는 것


ㅇ 그룹 함수

  • 행 집합에 작용하여 그룹 당 하나의 결과를 생성 (return)
  • 그룹 : 받아들이는 데이터의 범위
    • 사용자가 지정한 그룹별로 리턴
  • NULL 값을 무시한다.★ (COUNT(*) 제외)
    • 항상 NULL 값 신경 쓰기
SELECT AVG(받아들일 인수값의 컬럼이름), SUM(받아들일 인수값의 컬럼이름)
       MIN(받아들일 인수값의 컬럼이름), MAX(받아들일 인수값의 컬럼이름)
FROM 컬럼을 소유한 테이블
WHERE 조건식



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

  • 숫자 데이터만 가능
  • 문자, 날짜는 에러나 (예.입사일의 총합이 의미가 없잖아)
  • WHERE절을 이용해서 조건 추가
  • 업무이름에 REP 있는 사람들의 급여 평균과 합을 구하여라.
SELECT AVG(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%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(*)
    • 테이블의 행의 개수를 반환
    • 널 값, 중복 행 포함
  • 50번 부서에 근무하는 사원의 수 : 45명
SELECT COUNT( * )
FROM employees
WHERE department_id = 50
SQL> /
  COUNT(*)
----------
        45
  • COUNT(컬럼이름)
    • 컬럼의 행의 개수 반환
    • 널이 아닌 행 수 반환
  • 보너스를 받는 사원의 수 : 35명
SELECT COUNT(commission_pct)
FROM employees
SQL> /
COUNT(COMMISSION_PCT)
---------------------
                   35
  • 80번 부서에서 보너스 받는 수 : 34명
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 80
SQL> /
COUNT(COMMISSION_PCT)
---------------------
                   34
  • 와우! 전체 35명 중에서 34명이 이 부서에 있네..
    이런 부서에서 일을 해야겠네 ㅋㅋ



ㅇ DISTINCT 키워드 사용

  • 중복된 값을 제거하고 개수를 세라
  • COUNT뿐만 아니라 그룹함수 전체에 사용 가능한가 봐 (수업시간엔 COUNT로 했음)
  • 셀렉트에서 사용되는 DISTINCT 와의 차이점
    • 셀렉트 : 셀렉트 리스트 절에 의해 '출력'되는 데이터에서 중복이 제거되는 것
    • 그룹함수 : 값을 '받아들일 때' 중복을 제거하고 받아들여라
SELECT COUNT(DISTINCT 컬럼이름)
FROM 테이블

ㅇ 실습 : 사원이 근무하고 있는 부서번호를 세어라.

  • 부서테이블에서 번호를 세면 사원이 근무하지 않는 빈 부서까지 나오겠지
  • 그래서 사원테이블에서 검색해보려 해
  • 시도 1 : 사원테이블에서 d_id 카운트 하면 중복되는 번호 다 나와 : 106
SELECT COUNT(department_id)
FROM employees
SQL> /
COUNT(DEPARTMENT_ID)
--------------------
                 106
  • 시도2 : 그래서 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 결과 그대로 나와


좋은 웹페이지 즐겨찾기