그룹함수는 테이블의 전체 데이터에서 통계적인 결과를 구하기 위해서 행 집합에 적용하여 하나의 결과를 생산한다.
| 구분 | 설명 |
|---|---|
| SUM | 그룹의 누적 합계 반환 |
| AVG | 그룹의 평균 반환 |
| COUNT | 그룹의 총 개수 반환 |
| MAX | 그룹의 최대값 반환 |
| MIN | 그룹의 최소값 반환 |
간단하게 아래와 같이 활용할 수 있다. 그룹함수는 NULL 값은 무시하고 계산한다. 테이블 데이터에 NULL값이 있어도 상관이 없다.
--round로 결과값 반올림
select sum(salary) as "급여총액", round(avg(salary)) as "급여 평균",
max(salary) as "최대급여", min(salary) as "최소급여" from employee;
--null값은 무시
select sum(commission) as "커미션총액" from employee;
--데이터 개수
select count(*) as "사원의 수" from employee;
--중복 제거
select count(distinct job) as "직업종류의 개수" from employee;
이 함수는 특정 컬럼을 기준으로 그룹별로 나눌때 사용한다. 아래와 같은 형식으로 사용한다.
select [컬럼명], 그룹함수 from [테이블명]
where 조건 group by [컬럼명];
예시_01
--부서별로 부서번호, 급여평균 출력
select dno as "부서번호", avg(salary) as "급여평균"
from employee group by dno;

예시_02
--부서별 담당업무별로 직원수, 급여합계 출력
select dno as "부서번호", job as "담당업무", count(*) as "직원수", sum(salary) as "급여합계"
from employee group by dno, job
order by dno, job;

그룹에도 조건을 걸어서 조회를 할 수 있다. having을 이용하면 되는데, having은 group by로 묶여진 데이터에 대해 필요한 데이터를 뽑는 구문이다. where은 from으로 불러들인 데이터에만 사용할 수 있으니 이 부분에서 차이가 있다.
--그룹 조건 : having
--부서별로 최대급여가 3000 이상인 부서출력
select dno as "부서번호", max(salary) as "최대급여" from employee
group by dno having max(salary) >= 3000;

--1. 모든 사원의 급여 최고액, 최저액, 총급여, 평균급여 출력 - 평균 반올림, 별칭 사용
select max(salary) as "최고액", min(salary) as "최저액",
sum(salary) as "총급여", round(avg(salary)) as "평균급여" from employee;
--2. 부서별 인원이 4명보다 많은 부서의 부서번호, 인원수, 총급여 출력
select dno as "부서번호", count(*) as "직원수", sum(salary) as "총급여" from employee
group by dno having count(*) > 4;
--3. 부서별로 담당업무가 동일한 사원의 수 출력, 부서기준으로 내림차순 정렬
select dno as "부서번호", job as "담당업무", count(*) as "직원수" from employee
group by job, dno order by dno desc;
--4. 업무별 사원의 최저 급여 출력하되 관리자를 알 수 없는 사원과 최저급여가
-- 2000 미만인 그룹은 제외하여 출력, 급여 기준으로 내림차순 정렬
select job as "담당업무", min(salary) as "최저 급여" from employee
where manager is not null group by job having not min(salary) <2000
order by min(salary) desc;
--5. 각 부서에 대해 부서번호, 사원수, 부서내의 모든 사원의 평균 급여 출력,
-- 부서 기준으로 내림차순 정렬
select dno as "부서번호", count(*) as "직원수", round(avg(salary)) as "급여평균" from employee
group by dno order by dno desc;