앞서 우리는 조건으로 데이터를 필터링하는 WHERE문을 배웠다. 왜 그걸 쓰지 않고 HAVING절이라는 새로운 기능을 쓸까?
이유 1. HAVING 내부에서 집계함수를 사용 가능하기 때문에(WHERE문에선 불가능)
SELECT 학생ID, ROUND( AVG(성적) , 1) AS 평균성적
FROM 성적표
GROUP BY 학생ID;
HAVING AVG(성적) <= 75 ;
이유 2. WHERE문은 GROUP BY보다 먼저 실행되기 때문에 그룹화된 후에 조건을 걸어줄 수 없다.
WHERE -> GROUP BY -> HAVING 순서이므로 HAVING 은 GROUP BY 의 영향을 받는다! 따라서 GROUP BY 에 입력된 컬럼에 의해서 입력 가능한 컬럼의 제약이 발생한다.
다음 예제들에서 오류들을 파악해보자.
SELECT 부서ID, SUM(연봉)
FROM 직원
GROUP BY 부서ID
HAVING 연봉 >= 6000 ; → 여기서는 컬럼에 적용되는 일반조건을 걸어주려고한다.
하지만 이미 부서ID로 그릅화(줄어든 상태)되었기 때문에 일반조건을 줄 수 없다.
집계된 연봉에 조건을 주는 것은 가능하다!
SELECT 부서ID, SUM(연봉) AS 연봉합계
FROM 직원
GROUP BY 부서ID
HAVING 연봉합계 >= 6000 ;
연봉합계는 SELECT절에서 만든 별칭이다.
그런데 SELECT절의 실행 순서는 HAVING절 다음이기 때문에 별칭을 사용할 수 없다!