having, where를 이용한 조건절 비교

JP·2022년 1월 9일
0

database

목록 보기
2/2

sql을 사용하면서 having과 where를 꽤 자주 사용했음에도 말로 설명하기에 어려움을 겪었다.
이는 분명 내가 제대로 알고 사용하는게 아니라 코드블록을 그대로 복사해서 사용한 경험이 많기도 했고 사용하던 방법대로 쭉 사용해서 그랬음이 분명했다.
따라서 이 포스팅을 통해 having과 where의 쓰임, 차이를 구분하고자 한다.

우선 having을 아려면 group by라는 것을 알아야 한다
여기서 group by를 간단히 설명하자면, 결과로 나오는 row들을 group화 하고 MIN, MAX, SUM, COUNT, AVG와 같은 집계함수들을 각 그룹에 사용할 수 있는 것을 말한다.

다음과 같은 Customers 테이블 데이터가 있다.

CustomerIdCustomerNameCity
1JohnSeoul
2NecoSeoul
3AnnaLondon
4CarolLondon
5MarkNew york
select count(CustomerId),City
from Customers
group by city;

결과값은

count(CustomerId)City
2Seoul
2London
1New york

와 같은 식으로 나올 것이다.

이제 우리가 having 절을 이용하여 group을 이용하여 나온 로우값에 조건절을 걸 수 있다.

select 
count(CustomerId) count,
City
from Customers
group by city
having count>=2
;

위의 select 문에서 우리는 grouping 하여 나온 count의 수가 2 이상의 로우만을 추출하고 있다.

결과는

count(CustomerId)City
2Seoul
2London

다시 한번 seoul의 결과값을 추출하고 싶을 때는 where 절을 사용한다.

select 
count(CustomerId) count,
City
from Customers
where city ='Seoul'
group by city
having count>=2
;
count(CustomerId)City
2Seoul

위의 쿼리에서 where 와 having의 간단한 사용법을 알아보았고

이제 이 포스트의 주요 내용인 where 와 having의 차이점에 대해 설명할 것이다.

where절은 각각의 로우에 적용되는 조건절이다.
having절은 집계된것들에 대한 조건절이다.

where절은 group by 이전에,
having은 group by 이후에 쓴다.

FROM > WHERE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY 순으로 절들이 실행되는데 where절이 group by절보다 먼저 실행되기 때문에 group by가 적용된 레코드에 where를 적용하여 레코드를 필터링 할 수 없다.
having절도 마찬가지로 그룹화 된 레코드에 적용이 되는 원리이다.

간단히 말하자면,
where절은 조건을 기준으로 레코드를 가져온다. 테이블 레코드로 이동한 다음 우리가 부여한 조건에 따라 레코드를 가져오는 것이고
having은 위에서 최종적으로 나온 resultSet을 기준으로 동작한다고 보면 된다.

profile
to Infinity and b

0개의 댓글