(파일명 20231025_01_scott)
■ HAVING
- 그룹에 대한 조건을 걸 때 사용!
--■■■ HAVING ■■■--
--○ EMP 테이블에서 부서번호가 20, 30인 부서를 대상으로
-- 부서의 총 급여가 10000 보다 적을 경우만 부서별 총 급여를 조회한다.
SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN (20,30)
GROUP BY DEPTNO;
--==>>
/*
DEPTNO SUM(SAL)
30 9400
20 10875
*/
SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN (20, 30)
AND SUM(SAL) < 10000
GROUP BY DEPTNO;
--==>> 에러 발생
-- (ORA-00934: group function is not allowed here)
-- SELECT 파싱 순서가 WHERE 보다 뒤인데, WHERE 절에서 SELECT 문에 정의한 SUM(SAL)을 쓰려고 하니 쓸 수가 없음!!!
-- 이럴 때(그룹 조건 걸 때), 쓸 수 있는게 HAVING 절이다!!
SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN (20, 30)
GROUP BY DEPTNO
HAVING SUM(SAL) < 10000; -- 그룹에 대한 조건
--==>> 30 9400
-- HAVING절 사용 시 유의할 점
--1번 구문
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING SUM(SAL) < 10000
AND DEPTNO IN (20, 30);
-- 2번 구문
SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN (20, 30)
GROUP BY DEPTNO
HAVING SUM(SAL) < 10000;
-- 1번 구문과 2번 구문의 반환 값은 같지만 2번 구문이 더 적절하다.
-- 왜냐, 오라클에서 먼저 WHERE 까지의 데이터를 메모리에 퍼올리는데
-- 1번 구문은 전체 다 올린 후 HAVING 절에서 처리되니까 소요량이 많음
-- BUT! 2번 구문은 WHERE 절에서 DEPTNO가 20,30인 것들만 메모리에 퍼올려주니까
-- 효율적~!~!!