스마트인재개발원에서 배운 데이터베이스 - 복습2-2
ㅇ 본 수업은 "스마트인재개발원"에서 진행되었습니다.
#스마트인재개발원 #국비지원코딩교육 #데이터베이스 #그룹함수 #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 결과 그대로 나와
Author And Source
이 문제에 관하여(스마트인재개발원에서 배운 데이터베이스 - 복습2-2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@data_sy/blogsupporters2-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)