본문 바로가기

데이터베이스/SQL & PL/SQL

[SQL] 그룹 함수(Group Functions) 에 대해서 알아보자!


 Group Functions 개요 


 그룹 함수-집계 함수-는 무엇일까요? 간단히 정의 하자면, 여러 로우(ROW)들이 한데 모여있는 집합에 대해 하나의 결과를 가져다 주는 것이라 말할 수 있습니다.
이를 테면, 전체값의 평균이라던지, 전체값의 합이라던지, 전체의 수(갯수)라던지. 이런게 그룹 전체에 대해서 조회하는 것입니다.

 그럼, 어떤 그룹 함수들이 있는지 살펴보도록 할까요? 다음과 같이 7개의 함수가 존재합니다.
1. AVG         - 평균을 반환합니다.
2. COUNT     - Row의 갯수를 반환합니다.
3. MAX    l    - 최상위 값을 반환합니다.
4. MIN     l    - 최하위 값을 반환합니다.
5. STDDEV    - 표준편차를 반환합니다.
6. SUM         - 총 합을 반환합니다.
7. VARIANCE - 분산을 반환합니다.
 
 함수들의 이름을 보면 대충 어떤 함수이구나 하고 감이 잡히실 겁니다.

 몇가지 알아두고 가야 할 점 중에 하나는 이런 그룹 함수들은 Null 값에 대해서는 무시를 한다는 점입니다.
우선 hr스키마의 employees 테이블의 모든 로우(ROW)를 조회해 봅니다.

[실행화면]

..

 employees 테이블에는 107개의 로우가 존재하네요. 이것을 기억해두고 집계 함수를 써볼게요.
COUNT로 employees 테이블의 commission_pct 컬럼을 조회하겠습니다.

[실행화면]

 35개의 로우만이 조회되었습니다. 참고로 'commission_pct' 라는 컬럼에는 많은 'Null'들이 존재합니다.
이것으로 미루어 보았을때, Null은 아예 조회대상에서 무시되는 것을 볼수 있겠죠.

 그래서 주의해야 할건 이겁니다. 그룹함수(집계함수)들이 Null 값을 무시하기 때문에, 그 해석에 있어서 주의를 요구합니다.
간단히 예를 들면 이렇습니다. 모두 107명의 사원이 있습니다.  이중에서 부서아이디를 기준으로 'COUNT'를 써봅니다.

[실행화면]


 106건이 조회되었습니다. 이상합니다. 107 만큼 조회되어야 할텐데 왜 이럴까요? 그렇습니다. 부서에 속해있지 않은 사람이 있는거죠.
누굴까요? 바로 '사장님' 혹은 '회장님'입니다.

 그나마 카운트를 할때는 이해가 빠르나, 평균이나 분산,편차를 구할때는 조심해야 합니다. 누락되었는지 확인이 하기 힘들기 때문이죠.
그래서 이후에 알게될 NVL함수나 COALESCE 함수를 씁니다. 

 마지막으로 한가지더! 그룹함수는 WHERE절에서 쓰일 수 없습니다. 서브쿼리로 활용이 가능한데, 이는 다른 글에서 확인 합시다.



 Using


 그룹함수는 다음과 같이 쓸 수 있습니다.
SELECT AVG(salary), SUM(salary), MIN(salary), MAX(salary)
FROM hr.employees;

[실행화면]


 다음과 같이 확인할 수 있습니다. 여기서 다행인건, employees 테이블에는 직원들의 월급에 대해서 NULL값이 없음입니다.

 MIN과 MAX는 이렇게 숫자 데이터가 아닌 날짜 데이터 및 문자 데이터 형식에도 적용이 가능합니다.

[실행화면]


 보시게 되면 문자 데이터 같은 경우 알파벳 순으로 값이 조회되는 것을 볼 수 있습니다.
그리고 이런 그룹함수들을 사용하게 되면 중요한 것이 하나더 있는데 DISTINCT 와 ALL입니다. 다음글을 꼭 참고하셔서 확인하시길 바랍니다.
중복성 배제 관련글 확인하기


도움 되셨다면 밑의 추천(손가락 표시)과 댓글 부탁드립니다.