Programming/Database

[ORACLE 초급] 데이터 그룹화 GROUP BY절, HAVING절

728x90
반응형

GROUP BY절

데이터 그룹화 : 여러 데이터에서 의미 있는 하나의 결과를 특정 열 값별로 묶어 출력

SELECT   [조회할 열1], [조회할 열2], ..., [열N 이름]
FROM     [조회할 테이블명]
WHERE    [조회할 행을 선별하기 위한 조건식]
GROUP BY [그룹화할 열 지정 (여러 개 가능)]
ORDER BY [정렬할 열 지정];

EX! 부서별 평균 급여 (통합)

-- 하드 코딩 방식임
SELECT AVG(SAL), '10' AS DEPTNO FROM EMP WHERE DEPTNO = 10
UNION ALL
SELECT AVG(SAL), '20' AS DEPTNO FROM EMP WHERE DEPTNO = 20
UNION ALL
SELECT AVG(SAL), '30' AS DEPTNO FROM EMP WHERE DEPTNO = 30;
-- 위의 쿼리를 GROUP BY절을 이용해 작성
SELECT AVG(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO;

-- 부서의 직책별 평균 급여
SELECT DEPTNO, JOB, AVG(SAL) -- 부서 번호로 먼저 묶고 직책으로 다시 묶음
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;

유의점!?
SELECT절에서 다중행 함수를 사용하지 않은 일반 열을 GROUP BY절에 명시해야 함!
DEPTNO, JOB 모두 GROUP BY절에 등록해야지, 하나라도 안하면 오류 메세지 출력!

HAVING절

GROUP BY절을 통해 그룹화된 결과 값의 범위를 제한하는 데 사용

SELECT   [조회할 열1], [조회할 열2], ..., [열N 이름]
FROM     [조회할 테이블명]
WHERE    [조회할 행을 선별하기 위한 조건식]
GROUP BY [그룹화할 열 지정 (여러 개 가능)]
HAVING   [출력 그룹에 대한 조건식]
ORDER BY [정렬할 열 지정];

WHERE절 : 출력 대상 행을 제한!
HAVING절 : 그룹화된 대상을 출력에서 제한!

-- WHERE절이 GROUP BY절, HAVING절보다 먼저 실행 (처음부터 제거될 목적이면 WHERE절을 함께 사용)
SELECT   DEPTNO, JOB, AVG(SAL)
FROM     EMP
WHERE    SAL <= 3000
GROUP BY DEPTNO, JOB
HAVING   AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;
728x90
반응형