GROUP BY는 행을 그룹화하고 데이터를 집계하는 데 사용되지만, 잘못 사용하면 심각한 오류나 비효율적인 작업을 초래할 수 있습니다.
주요 세부 사항:
예시:
SELECT customer_id, COUNT(*) as orders FROM orders WHERE order_date >= '2024-01-01' GROUP BY customer_id HAVING COUNT(*) > 10;
GROUP BY 후의 SELECT에서 GROUP BY에도 없고 집계 함수에도 포함되지 않은 필드를 참조할 수 있나요?
답변: 아닙니다, 이는 대부분의 SQL 구현에서 오류를 발생시킵니다(예: MS SQL, PostgreSQL). 일부 특정 데이터베이스에서는 임의의 잘못된 값을 반환할 수 있지만(특히 MySQL에서 sql_mode 'ONLY_FULL_GROUP_BY'가 꺼진 경우), 이는 올바른 동작이 아니며 표준으로 보장되지 않습니다. 올바른 예시:
SELECT department, AVG(salary) FROM employees GROUP BY department;
이야기
전자상거래 프로젝트에서 "상품별 수익" 보고서를 위해 SELECT sku, price, SUM(qty) FROM orders GROUP BY sku 쿼리를 준비했습니다. 고려하지 않은 사항: price가 GROUP BY에 포함되지 않고 집계 함수 밖에 있어, MySQL에서 첫 번째 가격값을 반환하여 프로모션 기간에 보고서에 심각한 오류를 발생시켰습니다. 수정: price를 GROUP BY에 추가하거나 집계 기능을 사용해야 합니다.
이야기
BI 프로젝트에서 복잡한 보고서가 여러 JOIN과 GROUP BY로 인해 계획된 3분 대신 80분이 걸렸습니다. 분석 후 확인된 사항: GROUP BY 및 필터링 필드에 대한 인덱스가 없어 집계용으로 큰 임시 테이블이 생성되었습니다. 해결책: 인덱스 최적화 및 쿼리 재작성으로 테이블 표현식을 사용했습니다.
이야기
개발자가 집계되지 않은 사용자 속성으로 HAVING을 적용하여 값을 필터링했습니다. 결과적으로 서버는 모든 데이터를 그룹화한 후 HAVING으로 제거하여 성능이 저하되었습니다. 수정: 이 검사를 WHERE로 옮겨 집계 전에 선택 범위를 좁혔습니다.