DB/SQL - Oracle

[SQL] 기본 집계 함수 - count, sum, avg

생각많은 프로그래머 2024. 2. 7. 14:50

집계 함수도 SQL함수의 일종으로, 

대상 데이터를 특정 그룹으로 묶은 다음

이 그룹에 대해 총합, 최댓값, 최솟값 등을 구하는 함수를 말한다. 

 

대표적인 집계함수 7가지에 대해 살펴보고자 한다.

아래 집계함수를 활용하여 조회(select)하게 되면

결과값은 항상 숫자값인 튜플 하나가 나온다는 점도 기억하자.

각 함수에는 괄호가 붙고 그 괄호 안에는 매개변수가 들어간다는 점도 

매우 중요하다. 

집계함수(매개변수)

 

수학을 배우면서 익숙하게 봤던 단어들이라 

쉽게 생각할 수 있지만, 데이터를 다루는 입장에서

집계 함수를 쓸 때 생각해볼 지점들이 꽤 있다.

무엇보다도 제대로 알아두면 정말 유용하게 쓰일 수 있다.

 

  1. COUNT  - 튜플 수 산출
  2. SUM - 합계 산출
  3. AVG - 평균 산출
  4. MIN - 최솟값 산출
  5. MAX - 최댓값 산출
  6. VARIANCE - 분산 산출
  7. STDDEV - 표준편차 산출

 

COUNT  - 튜플 수 산출

 

count는 튜플 수를 반환하는 집계 함수이다. 

쿼리 결과 건수, 즉 전체 튜플 수를 반환할 수도 있고,

조건식, 표현식, 연산자를 활용하여 특정 그룹의 튜플 개수만

반환하는 데 사용되기도 한다.

select count(*)
from member ;         - member 테이블의 전체 튜플 수 반환

 

*자리에 컬럼명을 넣을 수도 있다.

이때는 해당 컬럼의 값이 있는,

즉 null값이 아닌 튜플의 수가 집계된다.

 

다만, 각 컬럼을 하나씩 넣어봤을 때 그 수가 다를 수도 있다.

예를 들어, department에 해당하는 부서명 컬럼과 phone에 해당하는 연락처 컬럼에 

근거하여 count 함수를 사용했을 때 아래와 같이 결과가 다르게 나왔다고 가정해보자.

select count(department)
from member ;  - 결과 : 107

select count(phone)
from member ;  - 결과 : 105

 

그 이유는 member 테이블에 연락처 정보가 없는, 즉 연락처 컬럼의 값이 null인

튜플이 2건 존재하기 때문이다.

 

* DISTINCT 활용하기

select문에서 괄호 안에 오는 *대신에 DISTINCT와 컬럼명을 같이 쓰면 

해당 컬럼명에 있는 유일한 값만 조회된다.

 

예를 들어 부서명(department)이 컬럼이라고 하면

한 부서에 한 명의 직원이 있는 경우는 거의 없다.

따라서 member 테이블에는 있는 부서명 컬럼에는

같은 부서명의 값을 가진 직원이 여러 명 있을 것이다.

 

이때 부서의 수가 몇 개인지 파악할 때 DISTINCT가 유용하게 쓰일 수 있다.

만약 부서의 수가 총 11개라면, 아래 명령어를 통해 11이 집계된다.

select count(DISTINCT department)
from member ; - 결과 : 11

 

이미 부서의 수가 11개라는 것을 알고 있었는데

위 select문으로 조회를 했더니 12개 반환되었다면 의아할 수 있다.

 

이때는 부서의 수가 실제로 12개가 있는 것인지

혹은 해당 컬럼의 값에 null이 있어서 그런 것인지 확인해야 한다.

department 컬럼에 해당하는 값에 

누군가 혹은 여러 명이 null을 가지고 있다면 

null도 하나의 부서명으로 집계되었을 수 있기 때문이다.

 

 

 

SUM  - 합계 산출

 

SUM은 전체 합계, 총합을 반환하는 함수로 

SUM(매개변수)의 형태로 사용한다.

SUM의 경우는 매개변수 자리에 숫자형만 올 수 있다.

매개변수 자리에 특정 컬럼이 올 경우

해당 컬럼의 데이터 타입이 숫자여야 한다.

 

member 테이블에서 "급여"에 해당하는 salary 컬럼을 활용하여

전 사원의 급여 총액을 구해보자.

select sum(salary)
from member ;    - 결과값 : 128654000   

 

SUM 함수 역시 DISTINCT가 올 수 있다.

select sum(salary), sum(DISTINCT salary)
from member ;    - 결과값 : 128,654,000   89,500,000

 

sum(salary)보다 sum(DISTINCT salary)

결과값이 더 작다는 것을 볼 수 있다.

그 이유는 sum(DISTINCT salary)에서는 중복된 급여의 값이

1번만 더해지기 때문에 그렇다.

 

sum(salary)의 경우는 중복여부와 상관없이 모든 값이 더해지고,

만약 직원 중에서 급여가 같은 경우가 있다면  

sum(DISTINCT salary)의 경우 해당 급여의 건수 1건만 더해지므로

sum(DISTINCT salary)sum(salary)보다 작을 수밖에 없는 것이다.

 

 

 

AVG - 평균 산출

 

member 테이블에서 "나이"에 해당하는 age 컬럼을 활용하여

전 사원의 나이 평균을 구해보자.

select avg(age), avg(DISTINCT  age)
from member ;    - 결과값 : 45  36

 

이 결과값을 보고 어떤 추측을 해볼 수 있을까?

일단, 전 사원의 평균 나이는 45세이다.

또한 중복값을 제외하고 산출한 평균값은 36세로 나왔다.

중복값이 얼마나 나왔는지 이 데이터만으로는 알 수 없기 때문에

36세로 나왔다고 해서 나이가 평균 이상인 직원이 나이가

평균 이하인 직원보다 상대적으로 더 많다고 단정지을 수는 없다.

 

이럴 때는 표준편차와 같은 다른 지표를 함께 활용하면

좀 더 정확한 판단을 할 수 있겠다.