묶어서 요약하기
GROUP BY가 row들을 지정한 컬럼 기준으로 버킷에 나눠 담고, 집계 함수가 버킷마다 한 번씩 돌아. HAVING은 집계가 끝난 다음에 버킷을 걸러내. WHERE와 대비해서 기억해. WHERE는 집계 전에 row를 걸러내거든.
연산 순서를 이렇게 그려두면 편해.
FROM과 join이 후보 row를 모아.WHERE가 그 row를 걸러내.GROUP BY가 살아남은 row를 버킷에 나눠 담아.- 집계 함수가 버킷마다 값 하나를 계산해.
HAVING이 버킷을 걸러내.SELECT가 컬럼과 표현식을 골라 내보내.ORDER BY와LIMIT이 마무리해.
Warning: SELECT한 컬럼 중 일부만 GROUP BY에 넣으면 Postgres는 에러를 내. SQLite는 그냥 통과시키고 집계 안 한 컬럼에는 아무 값이나 하나 골라 넣어. MySQL 5.7 이전과 똑같은 함정이지. 집계 안 한 SELECT 컬럼은 전부 GROUP BY에 넣거나 집계 함수로 감싸.