6. HAVING

jedo5000·2023년 11월 28일
0

DataBase

목록 보기
6/13

6.1 HAVING

  • 그룹화 상태의 데이터를 필터링(조건으로)

앞서 우리는 조건으로 데이터를 필터링하는 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절 다음이기 때문에 별칭을 사용할 수 없다!

0개의 댓글