[SQL] where절과 having 절의 차이
오늘은 SQL을 사용할 때
혼동하기 쉬운 문법인
where 절과 having 절의 차이에 대해서 포스팅 하겠다. (단, 아래 내용은 postgre sql 기준이다.)
보통 sql 문법은
select
from
where 로 이루어져 있는데
여기서 where는 기본적으로 from 에 들어있는 relation에 대한 조건으로써 역할을 하게 된다.
그런데 만약 group by 함수를 통해 데이터의 통계량을 그룹별로 구하였을 때, 그 그룹에 대한 조건을 걸기 위해서는 having 절을 사용해야 한다.
그 예로
select age
from patients
where age>=30;
이라는 구문을 쓰면 30세 이상의 환자들만 뽑히는 쿼리가 될 것이다.
그런데 만약
select disease, avg(age)
from patients
where avg(age)>=30
group by disease;
이라는 구문을 쓰게 되면 질병(disease)에 따라 환자들을 그룹화 하기전에 (즉 group by 문이 실행되기 전에) where절이 먼저 수행되게 된다. 따라서 이때는 avg(age)가 만들어지기 전이므로 에러가 나게 될 것이다.
이를 해결하기 위해서는 아래와 같이 having절을 사용해야 한다. having절은 group by가 실행된 후에 조건을 수행한다.
select disease, avg(age)
from patients
group by disease
having avg(age)>=30;
이 쿼리의 결과로 우리는 질병에 따른 환자들의 평균 나이를 볼 수 있는데 그 평균 나이가 30세 이상인 질병만 볼 수 있게 된다. 이처럼 having 절은 group by가 수행된 후에 수행되므로, 집계함수를 조건으로 걸 수 있게 된다.