database/Oracle

[Oracle] 그룹 함수 aggregate function

솧이 2022. 8. 31. 23:39

그룹 함수 aggregate function

단일행 함수(Single-Row Function)는 테이블 데이터에 여러개(레코드)에 ‘각각 적용’되어, 산출
그룹함수(Aggregate Function) 는 여러 개(레코드) 를 동시에 입력받아 ‘한개의 결과값’ 산

 

그룹함수 : 여러개의 record의 field 값을 계산하여 값을 내는 함수이다

GROUP BY : 그룹을 묶는 단위

HAVING : 그룹함수 결과에 대한 조건 (where과 헷갈리지 않도록 주의하기)

 

count 데이터들의 개수
sum 데이터들의 합계
avg 데이터들의 평균값
max  데이터 중 최대값
min  데이터 중 최소값
stddev 데이터 값들의 표준 편차 값
variance 데이터들의 분산 값
rank  

 

몇 개의 데이터가 있는지 나온다

* 컬럼의 개수가 아닌 컬럼의 수로 데이터의 수를 계산하는 것

★ 그룹함수에서는 null 값은 (기본적으로) 계산에서 제외한다

SELECT count(*), count(name), count(hpage) FROM t_professor;

 

null : 합산을 해도 null 값을 배제해서 결과가 나온다

SELECT avg(bonus) FROM t_professor;

 

다만! 위의 방식으로 하면 안된다

why? bonus를 받는 교수들에 대한 평균이지 전체 bonus column의 평균이 아니기에! -> null 처리하기

* 그룹함수는 null 값은 계산안하기 때문에 null 허용 필드에 대해 계산할때는 반드시 nvl, nvl2 사용해야 함.

SELECT 	avg(bonus), avg(nvl(bonus, 0))
FROM t_professor;

 

 

group by

* 아래와 같이 그룹 함수와 그룹 함수가 아닌 결과는 같이 select가 불가하다! -> oracle 에러

SELECT deptno, avg(nvl(bonus, 0)) 
FROM t_professor;

-> SQL Error [937] [42000]: ORA-00937: not a single-group group function

 

select 절에 사용된 그룹함수 이외의 컬럼이나 표현식은 반드시 group by 절에 사용되어야 한다

group by 절에 사용된 컬럼이 꼭 SELECT 절에 사용되지 않아도 됩니다.

group by 절은 반드시 컬럼명이 사용되어야 하며 별명(alias) 는 사용 불가.

 

 

그룹 함수와 아닌 것을 같이 select 하는 방법

SELECT round(avg(nvl(bonus, 0)), 1) "보너스 평균"
FROM t_professor
GROUP BY deptno;

 

학과별 평균 급여를 출력하되, 평균 급여가 450 보다 많은 학과만 SELECT 
에러가 난다 WHY? 
★ 단일함수와 달리 그룹함수는 WHERE 조건절에서 사용이 불가하다!!

     HAVING : GROUP BY 함수에 조건을 거는 것

SELECT deptno, AVG(pay)
FROM t_professor
WHERE AVG(pay) > 450
GROUP BY deptno;
--> 에러 뜬다!

-- HAVING : GROUP BY 함수에 조건을 거는 것
SELECT deptno, AVG(pay)
FROM t_professor
GROUP BY deptno
HAVING AVG(pay) > 300;

 


<SELECT 쿼리문 순서>       <처리 순서>
SELECT                               - (5)
FROM                                  - (1)

WHERE                               - (2)

GROUP BY                          - (3)
HAVING                               - (4)
ORDER BY                          - (6) select 처리한 다음에 나온다