Programming/SQL

[SQL] 집단연산자 - 집단함수( sum / avg / count /max / min / stdev / var ) , group by / having

reeme 2020. 12. 17. 22:55

집단 함수

: 테이블의 전체 행을 하나 이상의 컬럼을 기준으로 그룹화하여 해당 그룹 별 통계 값을 출력하는 함수

  (통계함수, 그룹함수라고도함)

-- select 절에만 사용가능 from/where 자리에 사용불가

SUM  그룹의 합계
AVG  그룹의 평균
COUNT  그룹의 개수
MAX  그룹의 최대값
MIN 그룹의 최소값
STDEV  그룹의 표준편차
VAR 그룹의 분산으로 집단 함수

 

예) employee 테이블에서 전체 월급합계sum ,  전체 월급평균avg, 전체 최대 월급 max, 전체 최소월급min,

      전체 사원수count를 조회하라

select sum(salary) as '전체 월급합계', 
avg(salary) as '전체 월급평균',
max(salary) as '전체 최대월급', 
min(salary) as '전체 최소월급', 
count(*)as '전체 사원수' -- 괄호안에 * 하면 null값 포함 전체 갯수/속성명을 주면 null값을 빼고 
from employee ;

 

 

SUM예) 전체 월급 합계 구하기 (그룹별)

select sum(salary) as '전체 월급합계'
from employee
group by dno;
-- 이렇게 하면 그룹별로 합계가 나옴 

 

 

AVG

예) 전체 직원 의 평균 봉급 을 구하기

select avg(salary) from employee ;

 

 

COUNT(*)  COUNT( 속성명 )

COUNT(*) 
-- 테이블에서 조건을 만족하는 행의 개수를 반환하는 함수
-- *는 모든 속성들이란 의미
COUNT(속성명)
-- 속성값이 NULL이 아닌 속성값의 개수
COUNT(DISTINCT 속성명)
-- 속성값이NULL이 아니며 중복되지 않는 속성값들의 개수
-- SUM,AVG도 DISTINCT를 쓸 수 있음
-- MIN, MAX에서는 DISTINCT가 의미 없음  

예) 사원테이블의 튜플수와 COMMISION의 개수 구하기

select count(*) as numrow, count(commission)
from employee; 


예) 사원의 직급(job)의 수와 중복되지 않는 직급(job)의 수 구하기

select count(job)as numjob, count(distinct job) as numdistinctjob from employee ;

 

MAX / MIN

예) 사원의 최대 봉급 , 최소봉급 구하기

select max(salary) as maxsal, min(salary) as minsal 
from employee;

Group by / Having 

Group by 

: 특정 속성을 기준으로 테이블 전체를 그룹으로 나누기 위한 절 부서별 사원의 평균 봉급

SELECT 컬럼 _ 리스트

FROM 테이블명

WHERE 조건

orderby

GROUP BY 컬럼 _ 리스트 (순서는 바뀔 수 없음 외워야함)

예)부서별 사원들의 평균 봉급 과 부서번호 검색 하기

select dno, avg(salary)as dnoavgsal from employee group by dno;

 

GROUP BY 사용 시 주의점
-- SELECT 절에는 집단 연산자나 GROUP BY 에 사용한 속성명만을 사용할 수 있음
-- 공통되는 속성값으로 그룹핑을 했으므로 , 각 그룹에서 개별 튜플을 접근할 수 없음
예) 부서별 사원들의 평균 봉급과 부서번호, 사원이름 검색하기 ( 오류 ) 

select dno, avg(salary) as dnoavgsal,ename from employee group by dno; 

 


HAVING
-- 각 그룹에 대한 제약 조건을 기술할 때 사용함
-- HAVING 절은 GROUP BY 절의 종속절임
-- GROUP BY 없이 HAVING 은 나타날 수 없음
-- WHERE 절은 테이블 전체에 대한 제약 조건을 나타냄
예) 부서의 최대 봉급이 500 초과인 부서 에 대해서만 부서별 사원들의 평균 봉급과 부서 번호 출력 하기

select dno, avg(salary) as dnoavgsal from emplyee group by dno having max(salary)>500;

 


구문순서

select 
from
where 그룹핑하기 전에 조건을 주는것 
group by 
having 그룹된 결과에 조건을 주는것 // group by 없이 having 절은 쓸 수 없음 
order by
;