18/04/24Oracle DB

 

sum 과 avg는 숫자에만 적용되는 함수입니다. 그룹함수는 NULL값을 연산에서 제외시킵니다.

 

  • sum
select sum(comm) from emp ;

 

  • avg

avg 함수를 썼을때 위에 써 놓았듯이 NULL값을 자동으로 배제시켜줍니다. 이럴 경우 전체의 평균을 보고싶다면 밑의 구문 형식으로 질의를 하면 됩니다.

select round(avg(nvl(comm,0)),3) from emp;

 

select count(-1) from emp where deptno IN(10,20);


사원 번호가 10, 20인 사람을 찾는 질의 입니다.

 

  • count
select COUNT(*) from emp where deptno=10;
select count(deptno) from emp where deptno=10;
select count(-1) from emp where deptno=10;


결과적으로는 3개의 질의 결과는 같습니다. 하지만 전체로 찾는 *는 성능적으로 오래 걸립니다. 마지막 구문은 그럴 경우 자주 쓰는 구문입니다.
사용법에 따라 조금씩 의미하는바가 달라지기도 합니다.
COUNT(*)는 중복되는 행과 NULL값을 포함하는 행을 모두 포함합니다.
COUNT(column)의 경우 NULL값은 제외하고 카운트를 하게 됩니다.

 

  • GROUP BY
select deptno, avg(sal) from emp ;

에러가 납니다. 그룹함수에 적용되지 않는 컬럼은 나열할 수 없습니다.
그룹 함수에 적용되지 않는 컬럼은 GROUP BY 절 뒤에 명시되어야 합니다.
group by는 그룹을 세분화 하기 위해서 씁니다.

select deptno , round(avg(sal)) from emp group by deptno order by deptno ;

select deptno "D_NUM" , round(avg(sal)) "AVG_SAL"
from emp where deptno != 20 
group by "D_NUM" order by "AVG_SAL" desc;

이번엔 별명을 붙여서 해보려 했으나 오류가 납니다. GROUP BY 절에서는 별명을 쓸 수 없습니다.

select deptno "D_NUM" , round(avg(sal)) "AVG_SAL"
from emp where deptno != 20 
group by deptno order by "AVG_SAL" desc;

select to_char(hiredate,'YYYY')"입사년도" , count(-1)"인원 수" from emp
group by to_char(hiredate,'YYYY') order by to_char(hiredate,'YYYY');

select job , sum(sal)"총 급여" from emp
group by job order by job;

select deptno, avg(sal) from emp where avg(sal)>=2000
group by deptno ;

여러가지 예제를 작성하던 중 이렇게 질의를 작성하자 에러가 납니다. WHERE절에서 GROUP함수는 쓸 수 없습니다.
GROUP함수가 적용되기 이전에 WHERE절 조건이 먼저 수행되기 때문입니다. 그래서 이런 경우에는 HAVING절을 써야 합니다.

    • HAVING

: 그룹함수의 조건절입니다. 그룹의 세분화를 합니다. 그룹함수를 중첩이 가능합니다.

select deptno, avg(sal) from emp having avg(sal)>=2000
group by deptno ;
select deptno, avg(sal) from emp 
group by deptno having avg(sal)>=2000;


HAVING절의 예제를 두개를 썼습니다. 두 질의의 결과는 같습니다.
전자처럼 해도 문제는 없으나 문맥적으로 볼 때 HAVING절은 GROUP BY 뒤에 오는게 맞다고 보여집니다.

select deptno, avg(sal) from emp
group by deptno
having avg(sal) = (select max(avg(sal)) from emp group by deptno);


HAVING을 이용한 질의입니다. 서브쿼리도 포함되어있습니다.