집계 함수는 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수를 집계 함수라고 하며 특성은 다음과 같다.
- 여러 행들의 그룹이 모여서 그룹당 단하나의 결과를 돌려주는 함수
- 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인 행을 다중행 함수의 대상에서 제외한다. 여러 번 강조했지만 실수가 나올 수 있기 때문에 한번 더..
'Database' 카테고리의 다른 글
서브쿼리인데 셀프조인을 곁들인 (0) | 2021.04.29 |
---|---|
ORDER BY JOIN DESC (0) | 2021.04.28 |
내장 함수(BUILT-IN-FUNCTION) - NULL 관련함수 (0) | 2021.04.27 |
내장 함수(BUILT-IN-FUNCTION) - 날짜형/변환형 (0) | 2021.04.27 |
내장 함수(BUILT-IN-FUNCTION) - 숫자형 (0) | 2021.04.27 |
댓글