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: 검색어 조정
GROUP BY
:<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name, product;</code>
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>
<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>
<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>
<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>
고유 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;
복잡한 조인: GROUP BY
과 함께 조인을 사용할 때는 집계를 신중하게 고려하세요. 집계 함수를 적절하게 사용하거나 하위 쿼리를 사용하여 쿼리를 리팩터링하세요.
ONLY_FULL_GROUP_BY
유지를 고려하세요.SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
SHOW GRANTS;
ONLY_FULL_GROUP_BY
활성화비활성화하고 싶지만 새 프로젝트에 대해 ONLY_FULL_GROUP_BY
을 활성 상태로 유지하고 SQL 표준을 준수하며 미묘한 쿼리 오류를 방지하는 것이 좋습니다.
ONLY_FULL_GROUP_BY
오류는 처음에는 실망스럽기는 하지만 더 나은 쿼리 디자인을 장려합니다. 목적을 이해하고 올바른 솔루션을 구현하면 MySQL 기술과 코드 유지 관리성이 향상됩니다. 정확한 데이터 선택과 적절한 집계 기능의 우선순위를 지정하세요. 즐거운 코딩하세요!
위 내용은 MySQL ONLY_FULL_GROUP_BY 오류: 쉬운 수정 및 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!