본문 바로가기
Database

집계 함수 (Aggregate Function)

by oncerun 2021. 4. 27.
반응형

집계 함수는 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수를 집계 함수라고 하며 특성은 다음과 같다.

 

 - 여러 행들의 그룹이 모여서 그룹당 단하나의 결과를 돌려주는 함수

 - GROUP BY 절은 행들을 소그룹화 한다.

 - 집계함수는 SELECT 절 , HAVING 절, ORDER  BY 절에 사용할 수 있다.

 

ANSI/ISO에서 데이터 분석 기능으로 분류한 함수 중 기본적인 집계 함수는 다음과 같다.

 

기본 형태

 

 집계함수명( [DISTINCT | ALL] 칼럼/표현식) 

ALL은 Default 옵션이므로 생략이 가능하다. DISTINCT는 같은 값을 하나의 데이터로 간주한다.

 

COUNT(*) -> NULL값을 포함한 행의 수를 뜻한다. 

COUNT(표현식) -> 표현식의 값이 NULL 값인 것을 제외한 행의 수

SELECT COUNT(*),COUNT(p.HEIGHT) FROM PLAYER p ;

다음 결과를 보면 전체 PLAYER의 행은 480개지만 플레이어의 HEIGHT은 447이 나온 것을 알 수 있다. 기본적으로 집계 함수는 NULL값을 제외하여 결과를 산출하기 때문에 NULL처리를 따로 NVL() 함수로 해줄 필요가 없다.

 

SUM([DISTINCT | ALL] 표현식) -> 표현식의 NULL 값을 제외한 합계

 

SELECT SUM(DISTINCT p.HEIGHT),SUM( p.HEIGHT) FROM PLAYER p ;

여기서는 같은 키를 하나의 값으로 보고 제외한 합계가 출력된다

 

 

 

AVG([DISTINCT | ALL] 표현식)  -> 표현식의 NULL 값을 제외한 평균

SELECT AVG(DISTINCT p.HEIGHT),AVG( p.HEIGHT) FROM PLAYER p ;

 

 

MAX([DISTINCT | ALL] 표현식) -> 표현식의 최대값을 출력한다. (문자, 날짜 데이터 타입도 가능하다)

MIN([DISTINCT | ALL] 표현식) -> 표현식의 최소값을 출력한다. (문자, 날짜 데이터 타입도 가능하다)

SELECT MAX(p.BIRTH_DATE),MAX( p.HEIGHT) FROM PLAYER p ;
SELECT MIN(p.PLAYER_NAME),MAX(p.PLAYER_NAME)  FROM PLAYER p ;

 

여기서 알아두어야 할 것은 날짜가 크다는 것은 최신날짜를 뜻한다.

문자는 ASCII코드값으로 크기를 비교합니다. 

 

TIP : 일반적으로 집계 함수는 GROUP BY절과 같이 사용되지만 테이블 전체가 하나의 그룹이 되는 경우는 GROUP BY절 없이 사용이 가능하다.

 

 

추가

 

GROUP BY절과 HAVING절

 

1. GROUP BY절 

 

  - GROUP BY 절을 통해 소그룹별 기준을 정한 후 SELECT 절에 집계 함수를 사용한다.

  - 집계 함수의 통계 정보는 NULL값을 가진 행을 제외하고 수행한다.

  - GROUP BY 절에서는 ALIAS 명을 사용할 수 없다.

  - 집계함수는 WHERE절에는 올 수 없다.

  - WHERE절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.

  - HAVING절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.

  - GROUP BY절에의한 소그룹별로 만들어진 집계 데이터를 HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.

  - HAVING 절은 일반적으로 GROUP BY절  뒤에 위치한다.

 

2. HAVING 절

 - WHERE절의 조건 변경은 대상 데이터의 개수가 변경되므로 결과 데이터 값이 변경될 수 있다.

 - HAVING절의 조건 변경은 결과 테이터 변경은 없고 출력되는 레코드의 개수만 변경될 수 있다.

 

이 차이를 헷갈리면 안된다. SELECT 문의 수행 구조를 보면 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순으로 실행된다. 집계 함수를 한다는 것은 결국 소그룹화 된 행으로 산출을 하는 것인데 WHERE절에서 행의 데이터가 제외된다면 나머지 행들만을 가지고 집계를 한다. 따라서 WHERE절에 잘못된 조건으로 집계 함수의 결과값이 잘못 도출되었는지 모르고 사용하다간 큰일 날 수 있다.

 

- 집계함수와 NULL

 

 다중행 함수는 입력갑승로 전체 건수가 NULL값인 경우만 NULL로 출력되고, 일부만 NULL인 경우는  NULL인 행을 다중행 함수의 대상에서 제외한다. 여러 번 강조했지만 실수가 나올 수 있기 때문에 한번 더..

반응형

댓글