♧ DBMS with MySQL

[DBMS] WHERE과 HAVING의 차이 | MySQL

Grit_0913 2024. 8. 6. 17:58

[DBMS] WHERE과 HAVING의 차이 | MySQL

하단의 목차를 클릭하여 이동할 수 있습니다 :)

1. WHERE과 HAVING의 차이
2. 집계 함수 적용 확인
3. 언제 어떻게 사용해야 할까?
        3-1. 시간 복잡도로 설명해 보기 (참고)
4. Reference

 

WHERE과 HAVING은 DBMS를 조작할 때 조건을 주기위해 사용하는 DML (Data Manipulation Language)이지만 작은 차이들이 존재한다. 이번 포스팅은 이에 대해 정리한다.


1. WHERE과 HAVING의 차이

[Figure 1] Order of operations

  • 주목해야할 부분은 WHERE 문이 HAVING 문보다 먼저 수행된다는 것이다.
    • 여담으로 SELECT 문은 쿼리를 짤 때 가장 먼저 오지만 수행 순서상 우선 순위에 존재하지는 않는다.
  • 수행 순서를 포함하여 WHERE과 HAVING의 차이점을 정리하면 다음과 같다.
    • WHERE 문은 GROUP BY가 적용되기 전에 수행된다. 따라서 WHERE 문은 'row(혹은 record)' 단위로 조건을 적용한다.
    • HAVING 문은 GROUPT BY 이후에 조건이 적용된다. 즉, row 단위가 아니라 'group (혹은 column)' 단위로 적용된다.
  • 마지막으로 쉽게 요약하자면 다음과 같다. 핵심은 집계 함수(aggregation functions, e.g. MIN(), MAX(), COUNT(), etc)의 적용 여부이다.
    • WHERE 문은 row 단위로 수행되기에 column 단위로 적용되는 집계 함수를 적용할 수 없다.
    • HAVING은 group 단위로 수행되기에 집계 함수를 적용할 수 있다.

2. 집계 함수 적용 확인

[Figure 2] WHERE & HAVING

  • WHERE 문에 집계 함수 AVG()를 적용하면 ERROR가 발생한다.
  • HAVING 문은 집계 함수 AVG()를 적용하여도 잘 수행된다.
    • 그러나 HAVING문은 GROUP BY 문이 적용되지 않거나 집계 함수가 적용되지 않는다면 ERROR를 반환한다.

[Figure 3] HAVING without GROUP BY or aggregation functions


3. 언제 어떻게 사용해야 할까? (참고)

  • 결론부터 이야기하면 집계 함수가 필요 없는 조건의 경우 WHERE을 사용하고, 집계 함수가 필요한 조건의 경우 HAVING을 사용한다.

 

3-1. 시간 복잡도로 설명해 보기

  • WHERE → GROUP BY의 경우 조건에 부합한 행을 먼저 필터링한 뒤(WHERE) 해당 결과에 GROUP BY를 적용하기에 불필요하게 GROUP BY가 적용되는 경우를 방지한다.

[Figure 4] WHERE → GROUP BY

  • 반면 GROUP BY → HAVING을 사용할 경우 모든 행에 GROUP BY를 적용하고, 해당 결과에 다시 HAVING을 적용하기에 작업에 필요한 단계(step)이 증가한다. 즉, 시간 복잡도가 증가한다.

[Figure 5] GROUP BY → HAVING

 

P.S. 간단한 메모 정도이기에 참고만할 것을 권장.


4. Reference