본문 바로가기

JAVA/Oracle

오라클 명령어 - group by 와 having 설명 및 예제

반응형

**칼럼값의 항목별로 나타내는 것

group by 칼럼값을 종류별로 나타내는 것

형식)

select 칼럼명 from 테이블명 group by 칼럼명;


예)

모든 사원의 평균급여를 출력

select avg(esal) from emp;


직급별 모든 사원의 평균급여 출력

select avg(esal) from emp group by erank;

// 결과값 : 평균값만 나옴


어떤직급의 평균급여인지 까지 출력

select erank, avg(esal) from emp group by erank;


** 오류발생 빈번한 경우

select ename, erank, avg(esal) from emp group by erank;

==> group by 절에 나타난 칼럼만이 select 절에 올 수 있다.


연습문제)

근무개월수가 60개월 이상인 근로자의 부서별 모든사원의 평균연봉을 출력하시오. 

단, 평균연봉이 높은순으로 출력

select dname, avg(esal*12) annsal from emp, dept 

where emp.dno = dept.dno

and months_between(sysdate, ehiredate) >= 60 

group by dname

order by avg(esal*12) desc;


** having

: group by 절에 나타난 결과에 조건식을 부여하고자 할 때 사용


연습문제2)

근무개월수가 60개월 이상인 근로자의 부서별 모든사원의 평균연봉을 출력하시오.

단, 평균급여가 8000만원 이상인 부서만 출력합니다.

단, 평균연봉이 높은순으로 출력

select dname, avg(esal*12) annsal from emp, dept 

where emp.dno = dept.dno

and months_between(sysdate, ehiredate) >= 60 

group by dname 

having avg(esal*12) >= 8000

order by avg(esal*12) desc;


** select 문의 형식

select 칼럼명1, 칼럼명2, ... from 테이블1, 테이블2,....

where 조건식

group by 절 

having 구문 

order by ; 


연습문제3)

2015년 이전에 입사한 남자근로자들의 직급별 최고급여를 출력하시오.

단, 최고급여가 300만원 이상인 직급만 출력하시오.

또, 최고급여가 높은순으로 출력합니다.

select erank, max(esal) 최고급여 from emp 

where to_char(ehiredate, 'yyyy') <= 2015 

and substr(ejumin, 8, 1) = '1' 

group by erank 

having max(esal) >= 300 

order by max(esal) desc;

반응형