GROUP BY는 행을 줄이는 문법이 아니라, 참조 기준을 "개별 행"에서 "그룹 결과"로 바꾸는 경계다. 대부분의 오류는 이 경계를 넘기 전에 집계값을 보거나, 넘긴 뒤에도 개별 행 컬럼을 그대로 보려 할 때 생긴다.
흔한 실수는 대부분 "지금 무엇을 참조할 수 있는가"를 섞어서 생긴다. 아래 표처럼 단계마다 허용되는 기준을 나눠 보면 오류 원인이 바로 보인다.
WHERE COUNT(*) >= 2
아직 그룹이 만들어지지 않았는데 집계 결과를 먼저 쓰려는 실수다.
HAVING COUNT(*) >= 2
집계 함수는 그룹이 생긴 뒤에만 의미가 있다. 행 필터는 WHERE, 그룹 필터는 HAVING이다.
SELECT name, AVG(price)
FROM products
GROUP BY category
그룹화하지 않은 name은 어떤 행을 대표해야 할지 모호하다. 별칭을 HAVING에서 바로 쓰는 것도 이식성이 떨어질 수 있다.
SELECT category, AVG(price)
...
HAVING AVG(price) > 50000
이 단계에서는 그룹 키와 집계식만 안전하다. HAVING 조건도 집계식을 직접 쓰는 편이 명확하다.
GROUP BY category
묶였다는 사실과 정렬됐다는 사실은 다르다. GROUP BY만으로 결과 순서는 보장되지 않는다.
ORDER BY MIN(price)
원하는 기준이 있으면 마지막에 명시적으로 정렬한다. 집계 결과로도 정렬할 수 있다.