핵심 경계

GROUP BY를 지나면 기준은 행이 아니라 그룹 결과로 바뀐다

흔한 실수는 대부분 "지금 무엇을 참조할 수 있는가"를 섞어서 생긴다. 아래 표처럼 단계마다 허용되는 기준을 나눠 보면 오류 원인이 바로 보인다.

WHERE 원본 행을 거른다
GROUP BY 행을 그룹 결과로 묶는다
SELECT · HAVING 그룹 키와 집계식을 본다
ORDER BY 원하는 출력 순서를 지정한다
단계
자주 하는 오해
이렇게 기억하면 된다
WHERE 그룹 전
오류 예시 WHERE COUNT(*) >= 2

아직 그룹이 만들어지지 않았는데 집계 결과를 먼저 쓰려는 실수다.

기억할 기준 HAVING COUNT(*) >= 2

집계 함수는 그룹이 생긴 뒤에만 의미가 있다. 행 필터는 WHERE, 그룹 필터는 HAVING이다.

SELECT · HAVING 그룹 후
오류 예시 SELECT name, AVG(price) FROM products GROUP BY category

그룹화하지 않은 name은 어떤 행을 대표해야 할지 모호하다. 별칭을 HAVING에서 바로 쓰는 것도 이식성이 떨어질 수 있다.

기억할 기준 SELECT category, AVG(price) ... HAVING AVG(price) > 50000

이 단계에서는 그룹 키집계식만 안전하다. HAVING 조건도 집계식을 직접 쓰는 편이 명확하다.

ORDER BY 출력 단계
오해 GROUP BY category

묶였다는 사실과 정렬됐다는 사실은 다르다. GROUP BY만으로 결과 순서는 보장되지 않는다.

기억할 기준 ORDER BY MIN(price)

원하는 기준이 있으면 마지막에 명시적으로 정렬한다. 집계 결과로도 정렬할 수 있다.