Tilo 2008. 7. 22. 18:04

HAVING

GROUP BY절과 WHERE절을 같이 사용하면 WHERE절이 GROUP BY절 보다 먼저 실행이 되기 때문에 error가 발생할 수 있다.

따라서 GROUP BY절을 사용하면서 조건을 따로 주기위해서 사용하는 것이 HAVING절이다.

SELECT deptno, job, SUM(sal) SUMSAL
FROM emp
GROUP BY deptno, job
HAVING SUM(sal) < 2500;

해설 : 부서번호와 직업으로 분류를 하면서 각 급여의 합이 2500 미만인 값을 SELECT한다.
이 HAVING절은 GROUP BY 절의 결과를 제한한다.
GROUP BY절의 결과 외에 다른 조건제한도 가능하다.

* GROUP BY한 결과만 HAVING에 쓰고, 다른 결과는 WHERE절에 쓰는 것이 더 좋다.(성능고려)
왜냐하면 WHERE절이 2번째로 실행되기 때문에 GROUP BY 하기 전에 datas를 제한하기 때문에 다음에 GROUP BY할 datas가 줄어들기 때문이다.


SQL문 실행순서 예

SELECT column, aggregate_function

FROM table

WHERE condition

GROUP BY group_by_expression

HAVING aggregate_condition

ORDER BY column;


1. FROM clause의 table에서 WHERE clause를 만족하는 rows를 찾는다.
2. 1의 결과 rows를 GROUP BY clause에 따라 grouping한다.
3. 2의 결과 groups에 대해 HAVING clause를 만족하는 groups를 찾는다.
4. 3의 결과 groups에 대해 SELECT list의 expressions를 구한다.
5. 4의 결과를 ORDER BY clause에 따라 정렬한다.

4 SELECT job, AVG(sal) PAYROLL
1 FROM emp
2 WHERE deptno IN (10, 20)
3 GROUP BY job
3 HAVING SUM(sal) > 5000
5 ORDER BY AVG(sal);

SELECT title, AVG(salary)
FROM s_emp
GROUP BY title
HAVING COUNT(*) > 3;

해설 : 사원이 3명 이상인 직종에 대해 직종별 평균 급여 출력

SELECT dept_id, title
FROM s_emp
GROUP BY dept_id, title
HAVING COUNG(*)>1;


해설 : 부서별로 2명 이상 근무하고 있는 직종만 출력


출처 : http://shoutrock.egloos.com/4083180