WHERE 는 묶기 전에 행을 거르고, HAVING 은 묶은 뒤에 그룹을 거른다.
왜 그런지까지
실행 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 다. 그래서 WHERE 에는 집계 함수를 쓸 수 없고, HAVING 에는 쓸 수 있다.
결과가 같아 보이는 조건이라도 시점이 다르면 숫자가 달라진다 — WHERE 로 먼저 걸러 내면 그 행은 애초에 집계에 들어가지 않고, HAVING 으로 거르면 집계는 다 한 뒤에 그룹만 버린다. SELECT 의 별칭을 WHERE 나 HAVING 에서 쓸 수 없는 것도 같은 이유다.
같은 450 이라는 숫자를 WHERE 에 둘 때와 HAVING 에 둘 때 부서별 인원이 어떻게 달라지는지 본다.
WHERE vs HAVING
WHERE 는 묶기 전 행을 거르므로 집계 함수를 쓸 수 없고, HAVING 은 묶은 뒤 그룹을 거르므로 집계 함수를 쓸 수 있다.
넣어 두면 오늘 · 1일 · 3일 · 7일 · 14일 · 30일 간격으로 다시 물어봅니다