[Oracle] 그룹 함수 aggregate function
그룹 함수 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 처리한 다음에 나온다