MySQL 오류 코드 1055를 수정하는 방법

게시 됨: 2024-03-28

MySQL 오류 코드 1055는 SQL 모드 `ONLY_FULL_GROUP_BY` 활성화에 관한 것으로, 이는 GROUP BY 절이 해석되고 실행되는 방식에 영향을 미칩니다. 이 오류를 함께 풀어보고 변형, 근본적인 원인, 그리고 가장 중요한 수정 방법을 살펴보겠습니다.

오류 이해

MySQL 오류 코드 1055는 SELECT 문 및 GROUP BY 절과 관련된 특정 상황에서 발생합니다. 이 요구 사항은 데이터를 함께 그룹화하는 쿼리에서 모호한 결과를 방지하는 것을 목표로 합니다.

실질적으로 쿼리에서 데이터를 그룹화할 때 MySQL은 GROUP BY 절에 포함되지 않은 열에 대해 동일한 그룹에 속하는 여러 행을 처리하는 방법을 알아야 합니다. 'ONLY_FULL_GROUP_BY' 모드는 이러한 규칙을 적용하여 그룹화된 쿼리가 명확하고 모호하지 않도록 보장하는 MySQL의 방식입니다.

따라서 오류 1055가 발생하면 MySQL은 기본적으로 설명을 요구합니다. “선택하는 열에 대해 그룹화 방법(GROUP BY 절에 포함)을 정확하게 알려주거나 데이터를 집계하는 방법을 알려주십시오. (COUNT(), SUM() 등과 같은 함수를 사용하여).”

ONLY_FULL_GROUP_BY의 역할 이해

이 모드는 특히 복잡한 데이터베이스 환경에서 데이터 검색 작업의 정확성과 신뢰성을 보장하는 데 중요한 역할을 합니다.

'ONLY_FULL_GROUP_BY'가 활성화되면 MySQL은 명확한 규칙을 적용합니다. GROUP BY 절이 포함된 쿼리의 SELECT 목록에 열이 나타나면 해당 열은 다음 기준 중 하나를 충족해야 합니다.

집계 함수가 되어야 합니다 . 열은 COUNT(), SUM(), MAX() 등과 같은 집계 함수 내에서 사용됩니다. 이러한 함수는 함께 그룹화된 여러 행의 데이터를 요약하여 그룹당 단일 결과를 생성합니다.

GROUP BY 열에 기능적으로 종속됨 : 열은 GROUP BY 절에 나열된 열에 기능적으로 종속됩니다.기능적 종속성은 한 열(기능적으로 종속된 열)의 값이 다른 열(GROUP BY 절의 열)에 의해 고유하게 결정됨을 의미합니다. 간단히 말해서, GROUP BY 열의 특정 값에 대해 기능적으로 종속된 열의 가능한 값은 정확히 하나입니다.

오류의 변형

이 오류가 나타날 수 있는 몇 가지 방법은 다음과 같습니다.

  • MySQL 오류 코드 1055: SELECT 목록의 표현식 #1은 GROUP BY 절에 없으며 기능적으로 GROUP BY 절의 열에 종속되지 않는 집계되지 않은 열 'database.table.column'을 포함합니다. 이는 sql_mode=only_full_group_by와 호환되지 않습니다.
  • 오류 1055: ONLY_FULL_GROUP_BY: GROUP BY 절에 항목이 없습니다.
  • SQL 오류(1055): SELECT 목록의 식이 GROUP BY 절에 없습니다.
  • SQLSTATE[42000]: 구문 오류 또는 액세스 위반: 1055

이 오류가 발생하는 이유

MySQL 오류 코드 1055는 주로 GROUP BY 절을 사용하는 쿼리에 대해 더 엄격한 규칙을 요구하는 SQL 모드 'ONLY_FULL_GROUP_BY'가 활성화되어 있기 때문에 발생합니다. 주요 이유는 다음과 같습니다.

SQL 모드 `ONLY_FULL_GROUP_BY` 활성화됨 : 이 모드에서는 집계되지 않는 한 모든 SELECT 목록 표현식이 GROUP BY 절에 나타나야 합니다.모호한 쿼리 결과를 방지하도록 설계되었습니다.

SELECT 목록의 집계되지 않은 열 : SELECT 목록에 집계 함수(예: SUM, AVG, MIN, MAX, COUNT)로 래핑되지 않은 열이 포함되어 있고 이러한 열이 GROUP BY 절의 일부가 아닌 경우 MySQL은 이를 오류로 표시합니다. `ONLY_FULL_GROUP_BY`.

기능적 종속성 : MySQL은 집계되지 않은 SELECT 목록의 열이 기능적으로 GROUP BY 절에 종속될 것으로 예상합니다.기능적 종속성은 하나의 열이 다른 열을 고유하게 결정함을 의미합니다. 이 관계가 충족되지 않으면 MySQL에서 오류 1055가 발생합니다.

MySQL 오류 코드 1055 수정

이제 오류 코드 1055의 의미와 오류의 원인을 살펴보았으니 이제 이 오류를 해결하는 몇 가지 방법을 살펴보겠습니다.

쿼리 분석

MySQL 오류 코드 1055를 해결하기 위한 초기 단계에는 이 오류를 유발하는 쿼리를 분석하는 작업이 포함됩니다. 이 조사는 GROUP BY 절에 포함되지도 않고 집계되지도 않은 SELECT 절에 나열된 열을 찾아내는 것을 목표로 합니다. 이러한 불일치는 문제의 핵심입니다. MySQL은 ONLY_FULL_GROUP_BY SQL 모드에서 집계 함수가 아닌 SELECT 목록에서 참조되는 모든 열을 GROUP BY 절에서 선언해야 명확한 결과를 보장할 수 있기 때문입니다.

쿼리를 조정하세요

이 오류를 수정하려면 쿼리를 조정해야 합니다. 수정 사항은 ONLY_FULL_GROUP_BY 규정에 맞추는 데 중점을 둡니다. 다음은 규정 준수를 위한 두 가지 주요 전략입니다.

GROUP BY에 집계되지 않은 모든 열을 포함합니다.

포괄적인 포함 : 가장 간단한 방법은 집계 함수(예: COUNT, AVG, SUM 등)의 일부가 아닌 SELECT 목록에 나타나는 모든 열이 GROUP BY 절에 포함되도록 하는 것입니다.이 접근 방식은 GROUP BY 작업에 대한 SQL 표준에 맞춰 결과 집합의 각 행이 GROUP BY 절에 지정된 열에 의해 고유하게 식별되도록 보장합니다.

`date`, `region`, `amount` 열이 포함된 `sales`라는 데이터베이스 테이블이 있다고 가정해 보겠습니다. 지역별 총 매출액을 찾고 싶지만 초기 쿼리로 인해 오류 1055가 발생합니다.

초기 쿼리(오류 1055 발생)

 SELECT 날짜, 지역, SUM(금액)

판매에서

지역별 그룹;

이 쿼리는 `date`가 GROUP BY 절에 포함되지 않고 집계 함수 내에서 사용되지 않기 때문에 오류가 발생합니다.

수정된 쿼리(오류 1055 해결)

 SELECT 날짜, 지역, SUM(금액)

판매에서

GROUP BY 날짜, 지역;

GROUP BY 절에 `date`와 `region`을 모두 포함하면 쿼리가 `ONLY_FULL_GROUP_BY` SQL 모드를 준수하므로 오류가 해결됩니다.

그룹화되지 않은 열에 집계 함수 사용

전략적 집계 : GROUP BY 절에 집계되지 않은 열을 모두 포함하는 것이 비실용적이거나 쿼리의 의도와 다른 시나리오에서는 그룹화되지 않은 열에 집계 함수를 사용하는 것이 효과적인 대안입니다.이 방법은 ONLY_FULL_GROUP_BY 제한을 우회하여 고유하지 않은 데이터를 의미 있는 집계 결과로 통합합니다.

동일한 `sales` 테이블을 사용해 보겠습니다. 지역과 최신 판매 날짜를 선택하고 '지역'별로만 그룹화하려고 한다고 가정해 보겠습니다. '날짜' 열에 집계 함수를 적용하면 GROUP BY 절에 이를 포함하지 않고도 이를 달성할 수 있습니다.

초기 쿼리(오류 1055 발생)

 지역, 날짜 선택

판매에서

지역별 그룹;

'date'가 집계 함수나 GROUP BY 절에 없기 때문에 이 쿼리는 실패합니다.

수정된 쿼리(오류 1055 해결)

 지역 선택, MAX(날짜) AS 최신_판매_날짜

판매에서

지역별 그룹;

이 수정된 쿼리에서는 `MAX()` 함수를 사용하여 `date` 열을 집계하여 각 지역의 최신 판매 날짜를 선택합니다. 'region'은 GROUP BY 절의 유일한 열이고 'date'는 집계 함수 내에서 사용되므로 'ONLY_FULL_GROUP_BY' 요구 사항을 준수하여 오류를 해결합니다.

`ONLY_FULL_GROUP_BY` SQL 모드 비활성화

MySQL에서 `ONLY_FULL_GROUP_BY` 모드를 비활성화하는 것은 쿼리 논리가 GROUP BY 절에 추가하거나 집계할 수 없는 열의 포함을 요구하는 경우 최후의 수단으로 간주될 수 있습니다.

이 모드를 비활성화하면 MySQL 오류 코드 1055와 같은 문제가 즉시 해결될 수 있지만 비결정적 쿼리 결과가 생성될 위험이 있습니다. 이러한 비결정성은 쿼리가 다양한 조건에서 서로 다른 결과를 반환하게 하여 잠재적으로 프로덕션 환경에서 데이터 불일치 및 디버그하기 어려운 문제를 초래할 수 있습니다.

'ONLY_FULL_GROUP_BY'를 비활성화하는 방법

현재 데이터베이스 세션에 대해 `ONLY_FULL_GROUP_BY`를 일시적으로 비활성화하려면(연결 기간 동안에만 변경 사항이 지속됨을 의미) 다음 SQL 명령을 사용하십시오.

 SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

이 명령은 전역 SQL 모드 구성이나 다른 데이터베이스 세션에 영향을 주지 않고 세션의 SQL 모드에서 'ONLY_FULL_GROUP_BY'를 선택적으로 제거합니다.

전 세계적으로

MySQL 서버에 대한 모든 새로운 연결에 영향을 미치는 보다 영구적인 솔루션을 위해 다음을 사용하여 전역 SQL 모드 설정을 변경할 수 있습니다.

 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

이 명령을 실행하면 `ONLY_FULL_GROUP_BY`를 제거하여 서버 전체 SQL 모드 설정이 변경되고, 실행 후 모든 새 연결에 변경 사항이 적용됩니다. 이는 기존 연결에 영향을 미치지 않으며 변경 사항을 전체적으로 적용하려면 서버를 다시 시작하거나 새 연결이 필요하다는 점을 기억하는 것이 중요합니다.

MySQL 쿼리 관리 모범 사례

MySQL 쿼리를 처리할 때, 특히 복잡한 그룹화 및 집계 함수와 관련된 컨텍스트에서는 일련의 모범 사례를 채택하는 것이 중요합니다. 이러한 관행은 쿼리의 효율성과 정확성을 보장할 뿐만 아니라 특히 'ONLY_FULL_GROUP_BY' SQL 모드와 같은 제약 조건을 탐색할 때 데이터의 무결성과 신뢰성을 유지하는 데 도움이 됩니다.

데이터 관계 이해 : 데이터베이스 열 간의 관계 및 종속성을 깊이 이해합니다.데이터가 상호 연결되는 방식을 알면 보다 효과적인 쿼리를 구성하고 오류나 예상치 못한 결과를 방지하는 데 도움이 됩니다.

스키마 친숙도 : 정기적으로 데이터베이스 스키마를 숙지하세요.이러한 친숙함은 그룹화할 열과 집계 함수에서 효과적으로 사용할 수 있는 열을 인식하는 데 도움이 됩니다.

전략적 적용 : 특정 분석 목표를 달성하기 위해 집계 함수(예: `SUM()`, `AVG()`, `COUNT()` 등)를 신중하게 적용합니다.이러한 기능은 데이터를 요약하고 분석하는 강력한 도구이지만 부적절하게 사용하면 잘못된 결과를 초래할 수 있습니다.

과도한 집계 방지 : 적절한 그룹화 없이 대규모 데이터세트에서 집계 함수를 과도하게 사용하지 않도록 주의하세요. 이렇게 하면 성능 문제가 발생하고 데이터에서 수집하려는 통찰력이 모호해질 수 있습니다.

예상 결과 확인 : `ONLY_FULL_GROUP_BY` 비활성화 또는 쿼리 구조 변경 등 쿼리를 조정한 후에는 이러한 변경 사항을 광범위하게 테스트하는 것이 중요합니다.이 테스트를 통해 쿼리가 예상한 결과를 반환하고 데이터 무결성이 유지되는지 확인합니다.

성능 평가 : 테스트는 단지 정확성에 관한 것이 아닙니다.그것은 또한 성능에 관한 것입니다. 특히 대규모 데이터세트나 복잡한 집계로 작업할 때 쿼리가 데이터베이스 성능에 미치는 영향을 평가하세요.

마무리 생각

우리는 `ONLY_FULL_GROUP_BY`를 준수하도록 쿼리를 조정하거나 최후의 수단으로 이 모드를 비활성화하는 데 중점을 두고 MySQL 오류 코드 1055를 수정하는 방법을 다루었습니다. 우리는 데이터 무결성 및 쿼리 정확성을 보장하기 위한 모범 사례를 강조하고, 문제를 예방하고 안정적인 데이터베이스 운영을 보장하기 위해 SQL 표준을 이해하고 작업하는 것이 중요하다는 점을 강조했습니다.

AI로 WordPress 웹사이트 생성 가속화

10Web AI 웹사이트 빌더를 사용하여 비즈니스 요구 사항에 맞는 맞춤형 WordPress 웹사이트를 10배 더 빠르게 생성하세요.

귀하의 웹사이트를 생성하세요
신용 카드가 필요하지 않습니다