프로그래밍데이터 분석가 / 백엔드 개발자

SQL에서 GROUP BY 구문을 사용할 때, 특히 집계 및 복잡한 쿼리 최적화 시 어떤 주의해야 할 점들이 있을까요?

Hintsage AI 어시스턴트로 면접 통과

답변.

GROUP BY는 행을 그룹화하고 데이터를 집계하는 데 사용되지만, 잘못 사용하면 심각한 오류나 비효율적인 작업을 초래할 수 있습니다.

주요 세부 사항:

  • SELECT에서 GROUP BY에 포함된 열 또는 집계 함수만 허용됩니다.
  • 여러 JOIN이 있는 복잡한 쿼리에서는 중복과 잘못된 집계가 발생할 수 있습니다.
  • 형식적 순서: GROUP BY는 WHERE 다음에 수행되고 HAVING 이전에 수행됩니다.
  • 그룹화 열에 대한 인덱스가 없으면 대규모 데이터에서 쿼리가 매우 느리게 실행될 수 있습니다.
  • HAVING은 이미 그룹화된 후 필터링하고, WHERE는 그 전에 필터링합니다.

예시:

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로 옮겨 집계 전에 선택 범위를 좁혔습니다.