Home » SQL » BASIC » sql having 절과 where 절과의 차이점을 알아봅시다.

sql having 절과 where 절과의 차이점을 알아봅시다.

안녕하세요. SQL 기본 시리즈 중 4번째 글입니다. 이번 시간에는 sql having 절을 알아보고, where 과의 차이점을 알아보도록 하겠습니다.

  • from 절과 카티션 곱에 대해 알아봅시다. 링크
  • order by 절에 대해 알아봅시다. 링크
  • group by 절에 대해 알아봅시다. 링크
  • having 절에 대해 알아보고 where 절과의 차이점을 알아봅시다. [현재글]
  • select 절과 as 절에 대해 알아봅시다. 링크

sql where 절

먼저 sql의 where절을 잘 생각해 봅시다. 저는 도서의 목록 중에서 type이 ‘math’인 결과를 모두 구하려고 해요. 문제를 분석해 봅시다.

  • book 테이블에서
  • type이 ‘math’인 것을 골라야 합니다.

즉, 결과 셋에서 특정 조건을 filtering 하는 것이지요?

[그림 1] type이 math인 책을 구하는 쿼리

그러면 쿼리를 위와 같이 작성할 수 있습니다. 저 쿼리가 뜻하는 것이 뭔가요?

  • from
    • book에서 데이터를 뽑아올 것인데요.
  • where
    • type = ‘math’인 것만 뽑아올 거에요.

끝났지요? 즉, 전체 데이터들 중에, 특정한 조건으로 filtering 하는 역할을 하는 것이 where 절이라고 생각하시면 됩니다.

[그림 2] 또 다른 where절 쿼리

이번에는 title이 부분 문자열 ‘a’를 가지고 있는 책을 모두 뽑아 볼게요. 이 경우도 where 절을 이용하면 됩니다. 전체 book에서 특정한 조건을 가져 오는 것이기 때문입니다.

[그림 3] 또 다른 where 쿼리의 결과

결과를 볼까요? math, algebra, math2 이렇게 3개가 나왔음을 볼 수 있어요. 이 3개는 title이 부분 문자열로 ‘a’를 가지는 것들입니다. 이렇게 where절은 전체 레코드 중에서 특정 조건을 만족하는 것만을 가져올 때 쓰게 됩니다.


sql having where의 차이

having은 집계된 결과에서 filtering을 합니다.

[그림 4] 1번 쿼리

먼저 1번 쿼리를 볼게요. 이전 글을 보셨다면, 해석하는 데 별 어려움이 없을 거에요. 무슨 의미인가요?

  • book 으로부터 결과를 얻어올 것인데요.
  • author_id를 기준으로 집계할 거에요.
  • 집계 함수는 count네요.

즉, 각 작가별로 몇 권의 책을 썼는지를 나타냅니다.

[그림 5] 1번 쿼리의 결과

7번 작가가 3권의 책을 썼고, 1번 작가가 2권의 책을 썼어요. 그런데, 저는 여기서 2권보다 많은 책을 쓴 사람만 가지고 오고 싶단 말이지요. 이미 집계된 결과에 filtering을 걸고 싶은 것이지요? 이 때, having을 쓰게 됩니다.

[그림 6] 2번 쿼리

이제 이 쿼리를 해석해 볼까요?

  • book으로부터 결과를 얻어올 것인데요.
  • author_id를 기준으로 집계할 거에요.
  • 집계 함수는 count인데요. count가 2보다 큰 것만 뽑을 거에요.

요래 되는 것이지요. 이를 도식화 해서 그려보겠습니다.

먼저, author_id별로 group by 했습니다. 집계 함수가 count(*)인데요. 작가가 1인 것은 count 결과가 2, 작가가 7인 것은 count의 결과가 3이 나옵니다. count 결과가 2 초과인 것만 가져오라고 했습니다.

고로, 실제로 having 절에 의해, 작가가 7인 사람이 3권의 책을 썼다는 결과가 나오게 됩니다. 이해가 되나요? where 절이 from으로부터 가져온 결과를 filter 하는 것이라면, having은 group by로 묶인 그룹을 필터링 하는 것입니다. 뉘앙스가 달라요.

[그림 7] 2번 쿼리의 결과

2번 쿼리의 결과는 위와 같습니다.


문제

제대로 이해했는지 문제 하나를 풀어봅시다. 장르가 math인 책을 각 작가별로 몇 개나 썼는지 가져오는 쿼리를 작성해 봅시다. 어떻게 해야 할까요?

  • book 으로부터 결과 셋을 얻어오는데요.
  • 그 중에 type이 ‘math’인 것만 가져와야 합니다.
  • 이 결과를 author_id별로 집계해서, count로 가져옵니다.

having이 아닌 것을 조심해야 하는데요. 그 이유는 집계 대상이 타입이 ‘math’인 것으로 한정되기 때문입니다. 집계 후 필터링이 아니라는 의미입니다. 고로 쿼리는 아래와 같이 됩니다.

[그림 8] 3번 쿼리

이제 결과를 보겠습니다.

[그림 9] 3번 쿼리의 결과

1번 작가가 math 책을 1권, 7번 작가가 2권 썼다는 결과가 나옵니다.

실제로, type이 math인 책의 작성자를 뽑아오면 위와 같습니다. sql having은

  • 집계 결과를 filtering 하는 데 쓰입니다.
  • 집계 후 집계 결과 filtering만 기억해 주세요.

문제에서는 집계 전 filtering을 요구했어요. 즉, 집계 대상이 type이 ‘math’인 것이였으므로, having 보다는 where 절로 선 filtering 하고 후 집계하는 것입니다.

Leave a Comment

17 + 9 =