본문 바로가기

DB/Oracle

[Oracle] SQL 복수행 함수 (그룹 함수) - GROUP BY, HAVING, ROLLUP

GROUP BY 절

- 그룹으로 묶기 위함

- 만약 그룹 조건이 여러 개일 경우 GROUP BY 절에 이어서 작성하면 됨

  • 예시 1) 부서별 월급 평균을 구하라.
    SELECT DEPTNO, AVG(NVL(sal, 0)) FROM emp GROUP BY DEPTNO;

  • 예시 2) 부서와 직업별 월급의 평균을 구하라. (단, 부서 번호와 직업에 따라 오름차순으로 정렬하라)
    SELECT deptno, job, AVG(NVL(sal, 0)) "AVG" FROM emp GROUP BY deptno, job ORDER BY 1, 2;

- 주의사항

  • SELECT 절에 사용된 그룹 함수 이외 컬럼이나 표현식은 반드시 GROUP BY 절에 사용되어야 함.

    한 마디로 그룹핑 대상이 아닌 컬럼을 SELECT 절에 작성해서는 안 되며,
    반대로 GROUP BY 절에 사용된 컬럼이더라도 SELECT 절에 사용할 필요는 없음.

  • GROUP BY 절에 반드시 컬럼명이 사용되어야 하며, 컬럼 Alias는 사용하면 안 됨.
    SELECT 문의 실행 순서를 보면 SELECT 절은 GROUP BY 후에 실행됨.

HAVING 절

- 그룹핑한 조건으로 검색 가능

- WHERE절 vs HAVING절

--> WHERE : 출력 데이터의 조건

--> HAVING : 그룹핑한 데이터의 조건

  • 예시) 부서 및 직업 별 연봉의 평균을 구하는데, 부서 번호가 20 이상이고, 연봉 평균이 3천 이상인 경우
    SELECT DEPTNO, JOB, AVG(NVL(sal, 0)) FROM emp WHERE deptno > 10 HAVING AVG(NVL(sal,0)) >= 3000;