그룹 함수와 Having 절
; 그룹 함수를 포함한 조건은 일반 조건과 계산하는 시점이 다르다. 일반 조건의 경우 컬럼의 값을 단지 조건과 비교하면 되지만 그룹 함수의 결과를 조건으로 하는 경우 GROUP BY 절의 사용 유무에 따라 결과 값이 달라지므로 조건에 그룹 함수가 포함된 경우 이것은 일반 조건과 동일한 시점에 처리할 수 없다. SQL 은 이를 위해 HAVING 절을 제공한다.
HAVING 절은 조건 중에 그룹 함수가 포함된 것만을 모아서 기술하는 구문이다.
=> 그룹함수에 대한 조건은 HAVING 절에 사용한다.
SELECT 컬럼 or 그룹함수...
FROM 테이블
WHERE 일반 조건
GROUP BY 그룹대상(일반컬럼)
HAVING 그룹함수포함조건
ORDER BY 정렬 대상;
1) HAVING : 조건 중에 그룹함수를 포함하는 조건 기술
2) HAVING 절은 GROUP BY 절 뒤에 기술한다
3) HAVING 절의 해석은 WHERE 절과 동일하다
다만 그룹 함수를 포함하는 조건은
HAVING 절에 해야만 한다
1) 부서별로 평균급여가 3000이상인 부서만 출력하세요
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno;
-- 에러 발생
SELECT dno, ROUND(AVG(sal))
FROM emp
WHERE AVG(sal) >= 3000
GROUP BY dno;
그룹함수 조건은 WHERE 절에 사용할 수 없다
3000이상인 부서만 출력하면
전제 조건이 부서별 평균급여가 먼저 계산되어야
조건 비교가 가능하다.
그러므로 WHERE 절보다 HAVING 절의 조건비교가 늦게 된다.
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING AVG(sal) >= 3000;
2) 20번 부서가 아니면서 평균급여가 3000이상인 부서만 출력하세요
--일반 컬럼의 조건을 HAVING 절에 사용하는 것은 권장하지 않는다.
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING dno!='20' AND AVG(sal) >= 3000;
--일반 조건은 WHERE 절에 기술한다
SELECT dno, ROUND(AVG(sal))
FROM emp
WHERE dno!='20'
GROUP BY dno
HAVING AVG(sal) >= 3000;
1)GROUP BY 절에 따른 그룹 함수 결과 값의 변화
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno;
SELECT ROUND(AVG(sal))
FROM emp
GROUP BY dno;
SELECT job, ROUND(AVG(sal))
FROM emp
GROUP BY job;
SELECT ROUND(AVG(sal))
FROM emp
GROUP BY job;
2) 부서별 급여 평균이 3천 달러 미만인 부서의 부서번호와
평균 급여를 검색한다
SELECT dno, ROUND(AVG(sal))
FROM emp
GROUP BY dno
HAVING AVG(sal) < 3000;
SELECT dno, dname, ROUND(AVG(sal))
FROM emp
JOIN dept USING(dno)
GROUP BY dno, dname
HAVING AVG(sal) < 3000;
3) 개발 업무가 아닌 부서별 인원수를 검색하세요
SELECT dno, COUNT(*) "부서별 인원수"
FROM emp
WHERE job!='개발'
GROUP BY dno;
--SELECT dno, job, COUNT(*) "부서별 인원수"
-- FROM emp
-- WHERE job!='개발'
-- GROUP BY dno, job;
4) 그룹함수의 조건인 아닌 것은 WHERE 절에 기술한다
5) HAVING 절은 그룹함수의 조건이나
GROUP BY 에 기술한 컬럼의 조건이 가능하다
그러나 HAVING 절은 그룹함수의 조건만 사용하고
GROUP BY 에 있는 일반 컬럼이라도 WHERE 절에 사용하는 것을
권장한다.
'프로그래머 > SQL(Oracle)' 카테고리의 다른 글
SQL)Oracle_서브쿼리/다중행/다중열 (0) | 2023.03.13 |
---|---|
SQL)Oracle_서브쿼리/단일행서브쿼리 (0) | 2023.03.13 |
SQL)Oracle_GROUP함수 (0) | 2023.03.13 |
SQL)Oracle_SELECT_단일행함수/변환함수 (14) | 2023.03.13 |
SQL)Oracle_단일행함수/숫자/날짜형함수 (2) | 2023.03.13 |