[DBMS] WHERE과 HAVING의 차이 | MySQL
하단의 목차를 클릭하여 이동할 수 있습니다 :)
1. WHERE과 HAVING의 차이
2. 집계 함수 적용 확인
3. 언제 어떻게 사용해야 할까?
3-1. 시간 복잡도로 설명해 보기 (참고)
4. Reference
WHERE과 HAVING은 DBMS를 조작할 때 조건을 주기위해 사용하는 DML (Data Manipulation Language)이지만 작은 차이들이 존재한다. 이번 포스팅은 이에 대해 정리한다.
1. WHERE과 HAVING의 차이
- 주목해야할 부분은 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. 집계 함수 적용 확인
- WHERE 문에 집계 함수 AVG()를 적용하면 ERROR가 발생한다.
- HAVING 문은 집계 함수 AVG()를 적용하여도 잘 수행된다.
- 그러나 HAVING문은 GROUP BY 문이 적용되지 않거나 집계 함수가 적용되지 않는다면 ERROR를 반환한다.
3. 언제 어떻게 사용해야 할까? (참고)
- 결론부터 이야기하면 집계 함수가 필요 없는 조건의 경우 WHERE을 사용하고, 집계 함수가 필요한 조건의 경우 HAVING을 사용한다.
3-1. 시간 복잡도로 설명해 보기
- WHERE → GROUP BY의 경우 조건에 부합한 행을 먼저 필터링한 뒤(WHERE) 해당 결과에 GROUP BY를 적용하기에 불필요하게 GROUP BY가 적용되는 경우를 방지한다.
- 반면 GROUP BY → HAVING을 사용할 경우 모든 행에 GROUP BY를 적용하고, 해당 결과에 다시 HAVING을 적용하기에 작업에 필요한 단계(step)이 증가한다. 즉, 시간 복잡도가 증가한다.
P.S. 간단한 메모 정도이기에 참고만할 것을 권장.
4. Reference
- 작업 순서도 그림
https://favtutor.com/blogs/order-of-operations-sql - WHERE과 HAVING의 쓰임새 차이
https://byjus.com/gate/difference-between-where-and-having-clause-in-sql/ - 실습 환경
https://sqlfiddle.com/mysql/online-compiler?id=57ace1ea-a89d-4b6b-99cb-4661f79ab0ba - WHERE → GROUP BY & GROUP BY → HAVING
https://stackoverflow.com/questions/328636/which-sql-statement-is-faster-having-vs-where
'♧ DBMS with MySQL' 카테고리의 다른 글
[DBMS] 날짜 차이 구하기 (TIMESTAMPDIFF, DATEDIFF) | MySQL (0) | 2024.08.21 |
---|