> 데이터 베이스 > MySQL 튜토리얼 > MySQL ONLY_FULL_GROUP_BY 오류: 쉬운 수정 및 모범 사례

MySQL ONLY_FULL_GROUP_BY 오류: 쉬운 수정 및 모범 사례

Linda Hamilton
풀어 주다: 2025-01-14 20:02:44
원래의
257명이 탐색했습니다.

MySQL ONLY_FULL_GROUP_BY Error: Easy Fixes and Best Practices

MySQL ONLY_FULL_GROUP_BY 오류가 발생했나요? 이 가이드는 초보자와 숙련된 MySQL 사용자 모두를 위한 명확한 설명과 실용적인 솔루션을 제공합니다.

이해 ONLY_FULL_GROUP_BY

ONLY_FULL_GROUP_BY은 표준 GROUP BY 동작을 시행하는 MySQL 설정입니다. 이 설정을 활성화하면 SELECT 문은 다음 규칙을 준수해야 합니다.

  • SELECT의 모든 열은 GROUP BY:에 있어야 합니다. 선택한 모든 열은 GROUP BY 절에도 포함되어야 합니다.
  • 다른 열에 대한 집계 함수: GROUP BY에 없는 열에는 집계 함수(예: COUNT, SUM, AVG, MAX, MIN)가 필요합니다.
  • 기능적 종속성: 선택한 열은 GROUP BY 절의 열에 기능적으로 종속되어야 합니다.

오류가 발생하는 이유

orders:

이라는 테이블을 생각해 보세요.
<code class="language-sql">CREATE TABLE orders (
    id INT,
    customer_name VARCHAR(100),
    product VARCHAR(100),
    amount DECIMAL(10,2)
);

INSERT INTO orders VALUES
(1, 'John', 'Laptop', 1000),
(2, 'John', 'Mouse', 20),
(3, 'Mary', 'Keyboard', 50),
(4, 'Mary', 'Monitor', 200);</code>
로그인 후 복사

이 쿼리는 오류를 발생시킵니다:

<code class="language-sql">SELECT customer_name, product, SUM(amount)
FROM orders
GROUP BY customer_name;</code>
로그인 후 복사

문제는? product이(가) 선택되었지만 그룹화되지 않았습니다. MySQL은 각 고객에게 어떤 제품을 표시할지 결정할 수 없습니다(고객이 여러 항목을 구매했을 수 있음).

오류 해결

해결책 1: MySQL 설정 수정

빠른 수정(세션 수준):

<code class="language-sql">SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));</code>
로그인 후 복사

영구적인 수정(전역 수준):

<code class="language-sql">SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';</code>
로그인 후 복사

해결책 2: 검색어 조정

  • 방법 A: GROUP BY:
  • 의 모든 열 포함
<code class="language-sql">SELECT customer_name, product, SUM(amount)
FROM orders
GROUP BY customer_name, product;</code>
로그인 후 복사
  • 방법 B: 집계 함수 사용(예: MAX, MIN):
<code class="language-sql">SELECT 
    customer_name,
    MAX(product) as product,
    SUM(amount) as total_amount
FROM orders
GROUP BY customer_name;</code>
로그인 후 복사
  • 방법 C: 하위 쿼리 사용:
<code class="language-sql">SELECT o.*
FROM orders o
INNER JOIN (
    SELECT customer_name, SUM(amount) as total_amount
    FROM orders
    GROUP BY customer_name
) grouped ON o.customer_name = grouped.customer_name;</code>
로그인 후 복사

실제 애플리케이션

  • 예시 1: 판매 보고서
<code class="language-sql">SELECT 
    category,
    MAX(product_name) as top_product,
    COUNT(*) as total_orders,
    SUM(amount) as total_sales
FROM sales
GROUP BY category;</code>
로그인 후 복사
  • 예시 2: 고객 분석
<code class="language-sql">SELECT 
    customer_id,
    MIN(first_name) as first_name,
    MIN(last_name) as last_name,
    COUNT(*) as total_purchases,
    SUM(purchase_amount) as total_spent,
    AVG(purchase_amount) as avg_purchase_amount
FROM customer_purchases
GROUP BY customer_id;</code>
로그인 후 복사

일반적인 함정 방지

  1. 고유 ID 누락: 틀림: SELECT id, customer_name, COUNT(*) FROM orders GROUP BY customer_name; 맞음: SELECT MIN(id) as first_order_id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;

  2. 복잡한 조인: GROUP BY과 함께 조인을 사용할 때는 집계를 신중하게 고려하세요. 집계 함수를 적절하게 사용하거나 하위 쿼리를 사용하여 쿼리를 리팩터링하세요.

모범 사례

  1. 데이터 요구사항을 명확하게 정의하세요.
  2. 적절한 집계 함수를 사용하세요.
  3. 모든 관련 열을 기준으로 그룹화합니다.
  4. 쿼리 정확도 향상과 SQL 표준 준수를 위해 ONLY_FULL_GROUP_BY 유지를 고려하세요.

문제해결

  1. 현재 MySQL 설정 확인: SELECT @@sql_mode;
  2. 변경 사항 확인: SHOW VARIABLES LIKE 'sql_mode';
  3. 검토 권한: SHOW GRANTS;

유지해야 하는 경우 ONLY_FULL_GROUP_BY 활성화

비활성화하고 싶지만 새 프로젝트에 대해 ONLY_FULL_GROUP_BY을 활성 상태로 유지하고 SQL 표준을 준수하며 미묘한 쿼리 오류를 방지하는 것이 좋습니다.

결론

ONLY_FULL_GROUP_BY 오류는 처음에는 실망스럽기는 하지만 더 나은 쿼리 디자인을 장려합니다. 목적을 이해하고 올바른 솔루션을 구현하면 MySQL 기술과 코드 유지 관리성이 향상됩니다. 정확한 데이터 선택과 적절한 집계 기능의 우선순위를 지정하세요. 즐거운 코딩하세요!

위 내용은 MySQL ONLY_FULL_GROUP_BY 오류: 쉬운 수정 및 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿