프로그래밍/Oracle, MySQL

오라클 그룹함수, group by, having

abfc 2016. 9. 29.
반응형

그룹함수 => 통계처리(계산목적)

 - 테이블의 전체 테이블에서 통계적인 결과를 구하기 위해 행 집합에 적용하여 하나의 결과를 생산함

 - 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등 하나의 결과를 구함


1. select 키워드 다음에 쓸 수 없는 컬럼 (실행 시 오류)

- 사번, 사원이름 등의 컬럼은 보통 한 그룹 안에 여러가지 값이 존재하므로 조회할 수 없음

  -> 특별한 기준이 없으므로 컴퓨터가 어느 레코드 하나만 알아서 가져다 줄 수 없음


2. select 키워드 다음에 쓸 수 있는 컬럼

- 어떤 크룹 안의 모든 사원의 부서번호는 항상 같아서, 부서번호가 그 그룹을 대표할 수 있으므로 조회가 가능

- 최대값이나 평균값 등도 그룹별로 하나로 묶어서 가지고 올 수 있으므로 조회가 가능

  -> max(sal), avg(sal)같은 그룹 함수들도 select 절에 쓸 수 있음


min(필드명) => 최소값, max(필드명) => 최대값 , Avg(필드명) => 평균값

count(필드명), count(*) => 컬럼에서 카운트에 만족하는 행위 개수를 구하는 함수

count(*) -> null값까지 포함해서 구함

 




group by절

 - 일반적으로 특정 그룹별 데이터를 필요로 할 경우에 group by절을 그룹함수와 함께 사용

 - group by절 사용 시, select에 지정한 컬럼은 group by에 모두 포함해야 함




ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

 -> select ~ from 사이에 컬럼과 그룹함수를 같이 사용하려면 group by절을 사용해야 함






*그룹함수는 숫자화 된 데이터에만 적용 되는건 아닙니다. 문서, 날짜 데이터도 가능




min(ename) => A~Z 알파벳의 초기나오는 순서

max(ename) => 알파벳의 후반부에 나오는 순서


min(hiredate) => 가장 오래 근무한 날짜

max(hiredate) => 가장 최근에 입사한 날짜



예제) 부서별로, 업무별로 그룹을 지어서 부서번호, 업무, 인원수, 급여의 평균, 합계 구하기



 




having절

 - 그룹함수를 사용해 group by절을 사용할 때 그룹들에 대한 제한 조건이 필요하여 사용하는, 그룹에 대한 조건절

 - select의 조건은 where절, group by절의 조건은 having절


예제) 부서별로 사원의 수가 4명 이상인 사원의 부서번호, 급여의 합계를 구하기


 


ORA-00934: 그룹 함수는 허가되지 않습니다

 -> where 조건식에는 그룹함수 사용이 불가하기 때문에 having절을 사용해야함





예제) emp테이블에서 직급이 CLERK이 아닌 사원에 대한 부서별로 급여의 합이

4000 이상인 부서의 정보를 출력 (부서번호, 급여의 합계순으로)



예제) emp테이블에서 전체 급여가 5000을 초과하는 각 업무에 대해서 업무와 월급여의 합계를 출력

(업무중에서 MANAGER는 제외, 월급여의 합계로 내림차순)




그룹함수도 중첩이 가능합니다.


부서별 평균값중에서 최대 평균 급여 -> max(avg(sal))

부서별 급여의 합중에서 최대 급여 -> max(sum(sal))

부서별 급여의 최소 급여중에서 가장 최소 급여 -> min(min(sal))

부서별 급여의 최대 급여중에서 가장 최대 급여 -> max(max(sal))












반응형

'프로그래밍 > Oracle, MySQL' 카테고리의 다른 글

[MySQL] 여러개 한번에 insert 하기  (4) 2021.01.15
오라클 서브쿼리  (0) 2016.09.29

댓글

💲 추천 글