SQL의 집계 함수

집계 함수

집계 함수는 DB에서 검색된 여러 튜플들의 집합에 적용할 수 있는 함수를 말합니다. 각 집계함수는 한 테이블의 한 컬럼에 적용되어, 단일값을 반환합니다.

집계 함수는 SELECT와 HAVING 절에만 나타날 수 있고, COUNT( * )를 제외하고는 모든 집계 함수들이 널값을 제거한 후 남아있는 값들에 대해서 연산합니다. COUNT(컬럼 이름은) 해당 컬럼에서 널값이 아닌 값들의 개수를 구합니다.

또한 키워드 DISTINCT가 집계 함수 앞에 사용되면 집계 함수 적용 전에 중복을 제거합니다.

집계 함수 사용 예제

전체 사원 수를 계산하시오.

select count(*) as num_person from employee; 

count(column): 해당 column의 값이 null이 아닌 행들의 갯수에 주의합니다.

부서에 소속된 사원들의 수를 구하시오.

select count(dno) from employee; 

직속상관이 있는 사원들의 수를 구하시오.

select count(manager) from employee; 

직급의 총 갯수를 구하시오.

select distinct count(title) from employee; -- x

select count(distinct title) from employee; -- o 

select distinct title from employee; 

distinct를 사용하려면 집계 함수 전에 사용해야 함을 기억합니다.

사원들의 평균 월급을 계산하시오.

select variance(salary), avg(salary) from employee; 

select sum(salary), count(*), (sum(salary)/count(*)) as cal, avg(salary) from employee; --avg를 사용하지 않고 구하기

사원들 월급의 분산을 계산하시오.

select sum(power((salary - 2750000), 2))/7 from employee; -- 1642857142857.1428 

select variance(salary) from employee; -- 1642857142857.1429 

GROUP BY

group by 절에 명시된 컬럼들을 이용하여, 해당 컬럼들을 기준으로 동일한 값을 갖는 튜플들이 묶여 하나의 그룹을 생성합니다.

group by 절에 명시된 컬럼들은 항상 select 절에 와야 합니다. group by는 데이터를 묶는 기능이기 때문에, group by에 사용된 컬럼 이후에는 반드시 집계함수만 적용할 수 있습니다.

사용 예제

직급별 사원 수, 직급별 평균 급여

select title, count(empno), avg(salary) from employee group by title;

직속상관 별로, 관리하는 직원들의 평균 월급과 관리하는 직원들의 수를 계산하시오. 직속 상관이 NULL인 회사 대표는 제외합니다.

select manager, avg(salary), count(*) 

from employee 

where manager is not null 

group by manager 

order by avg(salary) desc 

having
group by에 의해 그루핑된 튜플들에 적용되는 조건 절입니다. where이 모든 튜플에 대해서라면, having은 그루핑 된 튜플들에 대해서입니다.

부서 번호별로 그루핑하고, 부서별 사원수가 3명 이상인 부서번호와 사원수, 평균 급여를 보여주세요.

select dno, count(*), avg(salary)  

from employee 

where dno is not null 

group by dno 

having count(*) > 2 

order by dno 

직속상관 별로, 관리하는 직원들의 평균 월급과 관리하는 직원들의 수를 계산하시오. 이 때, 회사 대표는 제외하고 관리 직원 수가 2명 이상인 직속상관별로 검색하시오.

select manager, avg(salary), count(*) 

from employee 

where manager is not null 

group by manager 

having avg(salary) > 2000000 

order by avg(salary) desc 

부서 번호별로 사원수를 보여주세요. 이 때 1번 부서는 제외하세요.

select dno, count(*) 

from employee 

where dno <> 1 

group by dno 

 

select dno, count(*) 

from employee 

group by dno 

having dno <> 1 

이렇게 where과 having의 결과가 같은 경우도 있습니다. 순서의 차이이기 때문이죠.