C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]5. 그룹 함수를 사용한 데이터 집계 본문
● 그룹함수(집계함수)란?
단일 행 함수와는 달리 그룹 함수는 그룹 당 하나의 결과가 주어지도록 행의 집합에 대해 연산한다.
이러한 집합은 전체 테이블이거나 특정 그룹일 수 있다.
그룹함수는 열에 있는 null값을 무시한다.
null값을 포함하게 하고 싶으면, NVL함수를 쓰면 된다. (AVG그룹함수 설명에서 참고.)
- AVG
입력된 데이터의 평균을 구하는 함수.
Ex. AVG(sal)
sal 컬럼의 평균을 구한다. (NULL값 미포함)
AVG(NVL(sal, 0))
sal 컬럼의 평균을 NULL값의 경우 0으로 치환하여 구한다.
- MIN(sal), MAX(sal)
모든 데이터형에 대해서 MIN과 MAX가 가능하다.
☞ sal이 Date형일 경우
최근 날짜 : MAX
이전 날짜 : MIN
☞ sal이 문자열일 경우
A에 가까울수록 MIN
Z에 가까울수록 MAX
- COUNT
테이블 행의 수 리턴
☞ COUNT(*) : NULL값 포함 결과
☞ COUNT(col) : NULL값 제외한 결과
● GROUP BY
테이블의 행을 그룹으로 나눈다.
- SELECT절에 그룹 함수를 포함한다면, GROUP BY 절에 그룹함수가 아닌 각각의 열이 명시되어야 한다.
- WHERE절을 사용하여 행을 그룹으로 나누기 전에 미리 행을 제외시킬 수 있다.
- GROUP BY 절에 열을 포함해야 한다.
- GROUP BY 절에 열 별칭은 사용할 수 없다.
- 기본적으로, 행들은 GROUP BY 목록에 포함된 열의 오름차순 정렬로 저장된다.
ORDER BY 절을 사용하여 이것을 변경할 수 있다.
- GROUP BY절을 사용할 때, 그룹 함수에 포함되지 않는 SELECT 절의 모든 열들은 GROUP BY절에 포함되야한다.
Ex. SELECT deptno, AVG(sal) DEPTNO AVG(SAL)
FROM emp → ------------- -------------------------
GROUP BY deptno; 10 2916.6667
20 2175
30 6667
행은 부서번호에 의해 그룹화 되어 있으므로, 급여 열에 적용된 AVG함수는 각각의 부서에 대한 평균 급여이다.
->GROUP BY 절은 행을 GROUPING 한다.
- WHERE절을 사용하여 그룹을 제한할 수 없다.
그룹을 제한 하기 위해서 HAVING 절을 사용해야 한다.
Ex. SELECT deptno, AVG(sal) SELECT deptno, AVG(sal)
FROM emp FROM emp
WHERE AVG(sal) > 2000 → GROUP BY deptno
GROUP BY deptno; HAVING AVG(sal) > 2000;
☞ HAVING 절은 GROUP BY절 앞에 올 수 있지만, GROUP BY 절을 먼저 두는 게 더 논리적이므로 권장된다. HAVING 절이 SELECT 절에 있는
그룹에 적용되기 전에 그룹은 구성되고 그룹 함수는 계산된다.
* HAVING 절
- - WHERE 절에서는 그룹함수를 사용 할 수 없다.
- - HAVING 절은 그룹함수를 가지고 조건비교를 할 때 사용한다.
- - HAVING절은 GROUP BY절과 함께 사용이 된다.
● 중첩 그룹 함수
그룹 함수는 어떤 레벨까지라도 중첩할 수 있다.
Ex. 최대 평균 급여
SELECT MAX(AVG(sal))
FROM emp
GROUP BY deptno
☞ deptno로 그룹화면 sal의 평균 값들중 최댓값을 구한다.
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/기본]7. 다중 열 서브쿼리(Subquery) (0) | 2017.05.23 |
---|---|
[Oracle/기본]6. 서브쿼리(Subquery) (0) | 2017.05.23 |
[Oracle/기본]4. 다중 테이블로부터 데이터 디스플레이 (0) | 2017.05.22 |
[Oracle/기본]3. 단일 행 함수 (0) | 2017.05.19 |
[Oracle/기본]2. 데이터 제한과 정렬 (0) | 2017.05.15 |