[SQL] HAVING 사용법

sudog·2023년 8월 17일
1

SQL

목록 보기
5/7

집계함수를 사용하다 보면 집계 결과를 조건으로 걸고 싶은 상황이 생길 것이다.
아래 쿼리는 학급별 평균 점수를 구해 60점 이상인 학급만을 구하기 위해 작성하였다.

SELECT class, AVG(score) AS avg_score 
FROM student
WHERE avg_score >= 60
GROUP BY class;

하지만 위 쿼리는 제대로 작동하지 않는다. 이유가 무엇일까?
이것을 이해하려면 쿼리문의 작동순서에 대해 알아야 한다.

먼저 원하는 데이터를 테이블에서 가져오기 위해 WHERE절이 사용된다. 그 후에, 가져온 데이터를 대상으로 집계함수 사용이 가능한 것이다.
즉, WHERE절이 실행되는 시점에는 아직 집계할 데이터를 다 모으지 못한 상태이므로 집계함수를 사용할 수 없다.

그래서 필요한 것이 HAVING절이다. 대부분 GROUP BY와 같이 사용되며 집계함수의 결과를 조건으로 사용해 원하는 그룹만 보여준다.

따라서 위의 쿼리는 아래와 같이 변경되어야 한다.

SELECT class, AVG(score) AS avg_score 
FROM student
GROUP BY class
HAVING avg_score >= 60;

HAVING절에 집계함수가 꼭 들어갈 필요는 없지만, 집계함수를 쓰지 않아도 되는 조건이 있다면 WHERE절에 넣는 것이 더 효율적이다.
WHERE절로 원하는 데이터를 걸러내면 집계 자체에서 제외되기 때문이다. 예시 쿼리를 보자.

SELECT age, ROUND(AVG(height), 2)
FROM people
GROUP BY age
HAVING age >= 19;

위 쿼리는 성인을 대상으로 나이별 키 평균을 조사한 결과이다. 하지만 HAVING절의 조건을 보면 age라는 속성은 집계와 관련이 없다. 따라서 WHERE절로 조건을 옮겨주는 것이 좋다.

SELECT age, ROUND(AVG(height), 2)
FROM people
WHERE age >= 19
GROUP BY age;
profile
안녕하세요

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

예시로 이해하기 너무 좋네요~!

답글 달기