[Oracle] 오라클 - GROUP BY절 (HAVING 절)
by mini_min[Oracle]
오라클 - GROUP BY절 (HAVING 절)
✔️ 집계 함수란?
단일 행이 아닌, 행 그룹을 기반으로 단일 결과 행을 반환하는 함수
집계 함수는 SELECT, ORDER BY, HAVING 절에서 사용가능, WHERE 에서 사용할 수 없다.
✔️ GROUP BY 절
소그룹에 대한 항목별로 통계 정보를 얻을 때 사용한다.
❌ ALIAS 명을 사용할 수 없다.
WHERE 절이 먼저 실행 이후 GROUP BY 실행된다.
WHERE 조건 실행 후 GROUP BY 실행한다.
원칙적으로 ORDER BY 명시해야 정렬이 수행된다.
✔️ HAVING 절
조회된 테이블, 뷰의 개별 행 값이 아니라 집계 함수의 결과를 기반으로 출력에서 그룹을 제거한다.
GROUP BY 끝난 다음에는 HAVING 절에서 기술한다. (둘이 순서는 상관없지만),
일반적으로 GROUP BY 다음에 온다.
💡 집계함수 포함 실행 순서
FROM - WHERE - GROUP BY - HAVING - ORDER BY
✔️ GROUP BY 예제
GROUP BY 로 묶어줘야 풀리는 문제들이 많다. @@의 ## 값을 구하려면, @@ 그룹으로 묶어주는게 중요함
-- 부서별 여자 사원 수 : 여자 사원이 없는 부서는 출력 되지 않음 SELECT DISTINCT dept, COUNT(*) FROM emp WHERE MOD(SUBSTR(rrn,8,1),2) = 0 GROUP BY dept;
-- dept의 pos별 급여 총합 SELECT dept, pos, SUM(sal) FROM emp GROUP BY dept, pos ORDER BY dept, pos;
-- 개발부 인원수 SELECT dept, COUNT(*) FROM emp WHERE dept = '개발부' GROUP BY dept;
SELECT dept, COUNT(*) 전체, COUNT(DECODE(MOD(SUBSTR(rrn, 8,1),2),1,1)) 남자, COUNT(DECODE(MOD(SUBSTR(rrn, 8,1),2),0,1)) 여자 FROM emp GROUP BY dept;
--부서별 남자와 여자 급여 총합, 평균
SELECT dept 부서, DECODE(MOD(SUBSTR(rrn,8,1),2),0,'남자', '여자') 성별, COUNT(DECODE(MOD(SUBSTR(rrn, 8,1),2),1,0,1)) 인원수, TO_CHAR(SUM(sal), 'L99,999,999') "급여 총합", TO_CHAR(AVG(sal), 'L9,999,999') 평균 FROM emp GROUP BY dept, MOD(SUBSTR(rrn,8,1),2) ORDER BY dept;
✔️ HAVING 절 예제
-- 부서별 인원수가 7명 이상인 경우 SELECT dept, COUNT(*) FROM emp GROUP BY dept HAVING COUNT(*) >=7;
--부서별 여자 인원수 5명 이상 SELECT dept, COUNT(*) FROM emp WHERE MOD(SUBSTR(rrn,8,1),2)=0 GROUP BY dept HAVING COUNT(*)>=5;
블로그의 정보
개발자 미니민의 개발로그
mini_min