개발자 미니민의 개발스터디

[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

활동하기