📌 MySQL Group By와 집계 함수 활용(Error Code 1055 해결 방법)

2025. 3. 25. 15:35·기술블로그

📌 개념 정리

이번 포스팅에서는 MySQL에서 Error Code: 1055가 발생하는 원인과 이를 해결하는 방법에 대해 설명합니다. 이 오류는 ONLY_FULL_GROUP_BY 모드에서 GROUP BY를 사용할 때 비집계 함수가 GROUP BY 구문에 포함되지 않거나, 집계되지 않은 컬럼을 선택하려 할 때 발생하는 오류입니다. 이를 해결하는 방법은 두 가지가 있으며, 각각의 방법을 통해 오류를 해결할 수 있습니다.


🚦 Error Code: 1055의 원인

Error Code: 1055는 MySQL에서 ONLY_FULL_GROUP_BY 모드가 활성화된 경우 발생합니다. 이 모드에서는 GROUP BY 구문을 사용할 때, 비집계 컬럼을 그룹화 조건에 포함시키지 않으면 오류가 발생합니다. 예를 들어, AVG(review)와 같은 집계 함수 외의 컬럼이 GROUP BY 구문에 포함되지 않으면 이 오류가 발생합니다.

이 문제를 해결하려면, 그룹화 기준에 해당하는 컬럼을 GROUP BY 절에 포함시키거나, 집계 함수로 처리해야 합니다.


💻 해결 방법

📌 1. title을 GROUP BY에 추가하는 방법

설명: title을 GROUP BY 절에 추가하여 각 ranking별로 title 값을 포함한 집계 결과를 출력할 수 있습니다.

SELECT title, ranking, AVG(review) AS review_avg
FROM books
GROUP BY title, ranking
ORDER BY review_avg DESC;

변경 사항: GROUP BY ranking을 GROUP BY title, ranking으로 수정하여 title을 그룹화 조건에 포함시켰습니다. 이제 title과 ranking이 모두 그룹화된 상태에서 AVG(review)가 계산됩니다.

📌 2. title을 집계 함수로 처리하는 방법

설명: title을 그룹화 기준에 포함시키지 않고, 집계 함수로 처리할 수 있습니다. 예를 들어, GROUP_CONCAT(title)을 사용하여 각 ranking에 대한 title 값을 하나의 문자열로 결합할 수 있습니다.

SELECT GROUP_CONCAT(title) AS titles, ranking, AVG(review) AS review_avg
FROM books
GROUP BY ranking
ORDER BY review_avg DESC;

변경 사항: title을 GROUP_CONCAT 집계 함수로 처리하여 각 ranking별로 해당하는 title을 하나의 문자열로 결합한 후 출력합니다.

 

이 쿼리의 목적은 books 테이블에서 각 ranking별로 title(책 제목)을 하나의 문자열로 합치고, 해당 ranking에 대한 **review**의 평균을 계산한 후, **review_avg**가 높은 순으로 결과를 정렬하는 것이야.

1 GROUP_CONCAT(title)

GROUP_CONCAT 함수

  • 정의: GROUP_CONCAT은 MySQL에서 제공하는 집계 함수로, 여러 행에 있는 값을 하나의 문자열로 합치는 역할을 해. 주로 **GROUP BY**와 함께 사용되어, 여러 값을 그룹화하고 하나의 문자열로 합치는 데 사용돼.
  • 설명:
    • 이 함수는 여러 title 값들을 하나의 문자열로 결합하는데, 각 값은 기본적으로 **쉼표(,)**로 구분돼. 예를 들어, title이 "책 A", "책 B", "책 C"이면 GROUP_CONCAT 함수는 이를 "책 A, 책 B, 책 C"와 같은 형태로 결합해줌.
  • 예시:
SELECT GROUP_CONCAT(title) FROM books WHERE ranking = 1;
  • 위 쿼리는 **ranking = 1**인 모든 책 제목을 쉼표로 구분된 하나의 문자열로 반환할 거야. 예를 들어, ranking = 1인 책들이 "책 A", "책 B", "책 C"라면 결과는 "책 A, 책 B, 책 C"가 돼.
  • 기본 구분자: 기본적으로 **쉼표(,)**로 구분되지만, 구분자를 바꾸고 싶다면 SEPARATOR 키워드를 사용할 수 있어. 예를 들어, 구분자를 |로 바꾸면 다음과 같아:
SELECT GROUP_CONCAT(title SEPARATOR '|') FROM books WHERE ranking = 1;

2 ranking

  • 설명: ranking은 이 쿼리에서 GROUP BY 절에 사용되는 컬럼이야. **GROUP BY ranking**으로 ranking 컬럼 값에 따라 데이터를 그룹화해. 즉, 동일한 ranking 값을 가진 책들이 하나의 그룹으로 묶이고, 그 그룹 내에서 책 제목들이 결합되고 평균이 계산돼.
  • 예시:
    • ranking이 1인 모든 책들은 하나의 그룹으로 묶이고, 해당 그룹의 title 값들을 GROUP_CONCAT 함수로 하나의 문자열로 결합해.

3 AVG(review) AS review_avg

  • 설명: AVG(review)는 review 컬럼의 평균값을 계산하는 집계 함수야. 즉, 각 ranking 그룹에 대해 review 점수들의 평균을 구하는 거야.
  • 예시:
    • ranking = 1인 책들의 review 점수들(예: 4.5, 3.8, 4.0)에 대해 평균 점수를 계산해서 review_avg라는 별칭으로 반환해.

4 GROUP BY ranking

  • 설명: 이 구문은 ranking 값을 기준으로 데이터를 그룹화하는 역할을 해. 즉, ranking이 동일한 책들끼리 하나의 그룹이 되어, 그 그룹 내에서 title 값을 하나의 문자열로 결합하고, review의 평균을 계산해.
  • 예시:
    • 예를 들어, ranking = 1인 책들이 3권 있다면, 그 책들의 제목은 **GROUP_CONCAT**을 통해 하나의 문자열로 합쳐지고, review 점수의 평균을 계산하게 돼.

5 ORDER BY review_avg DESC

  • 설명: 계산된 review_avg (평균 리뷰 점수)에 대해 내림차순으로 결과를 정렬해. 즉, 평균 점수가 높은 것부터 낮은 것 순으로 결과를 보여줘.
  • 예시:
    • 평균 리뷰 점수가 높은 ranking부터 차례대로 표시됨. 예를 들어, ranking = 2인 책들의 평균 점수가 4.5라면, ranking = 2 그룹은 가장 높은 위치에 나타나고, 그보다 낮은 평균 점수를 가진 ranking은 뒤에 나올 거야.

6 쿼리 실행 예시

예를 들어, books 테이블에 다음과 같은 데이터가 있다고 가정하자:

titlerankingreview
책 A 1 4.0
책 B 1 4.5
책 C 2 3.5
책 D 2 4.0
책 E 3 5.0

쿼리 실행 결과는 이렇게 될 거야:

| titles                    | ranking | review_avg |
|---------------------------|---------|------------|
| 책 A, 책 B                | 1       | 4.25       |
| 책 C, 책 D                | 2       | 3.75       |
| 책 E                       | 3       | 5.0        |
  • ranking = 1인 책들은 **책 A, 책 B**로 결합되고, 평균 리뷰 점수는 (4.0 + 4.5) / 2 = 4.25로 계산돼.
  • ranking = 2인 책들은 **책 C, 책 D**로 결합되고, 평균 리뷰 점수는 (3.5 + 4.0) / 2 = 3.75로 계산돼.
  • ranking = 3인 책은 한 권이므로 **책 E**로 표시되고, 리뷰 점수는 5.0으로 그대로 표시돼.

7 고급 팁 – 개발자 성장에 도움 되는 활용법

  1. 🔥 GROUP_CONCAT의 성능 고려
    • GROUP_CONCAT은 많은 데이터를 결합할 때 메모리 사용이 커질 수 있으므로, 데이터의 양을 고려해 사용할 필요가 있어. 이 함수는 기본적으로 3,072자까지만 반환하므로, 길이가 긴 문자열을 다룰 때는 group_concat_max_len 설정을 늘려줘야 할 수도 있음.
  2. ✅ 구분자 변경
    • GROUP_CONCAT에서 기본 구분자 쉼표 외에 다른 구분자를 사용하고 싶다면 SEPARATOR 키워드를 사용할 수 있어. 예를 들어, |를 구분자로 사용하고 싶다면 GROUP_CONCAT(title SEPARATOR '|')로 쓸 수 있어.
  3. 🚀 대규모 데이터에서의 성능 최적화
    • 대용량 데이터에서 GROUP_CONCAT을 사용할 때는 인덱스를 적절히 사용하여 성능을 최적화하는 것이 중요해. 예를 들어, ranking 컬럼에 인덱스를 추가하면 그룹화 속도가 향상될 수 있어.

위 설명을 통해 GROUP_CONCAT 함수가 무엇을 하는지, 그리고 ranking 기준으로 책 제목과 평균 리뷰 점수를 어떻게 결합하고 계산하는지 잘 이해할 수 있을 거야!


🚀 고급 팁

🔥 ONLY_FULL_GROUP_BY 설정

이 오류는 ONLY_FULL_GROUP_BY 모드가 활성화되어 있을 때 발생합니다. MySQL 5.7 이상에서는 기본적으로 이 모드가 활성화되어 있으며, SQL 표준을 준수하기 위한 설정입니다. 이 모드를 비활성화하면 비집계 컬럼을 GROUP BY 없이 선택할 수 있지만, 이는 비추천됩니다. 대신, 위에서 설명한 대로 집계 함수나 GROUP BY 절을 활용하는 방법을 배우는 것이 중요합니다.

✅ GROUP BY와 HAVING을 활용한 데이터 필터링

GROUP BY와 HAVING을 적절히 사용하면, 집계된 결과에 대해 추가적인 조건을 부여할 수 있습니다. 예를 들어, 평균 리뷰 점수가 특정 값 이상인 ranking만 보고 싶다면 HAVING을 활용할 수 있습니다.

SELECT ranking, AVG(review) AS review_avg
FROM books
GROUP BY ranking
HAVING review_avg >= 4
ORDER BY review_avg DESC;

🚀 SQL 모드와 쿼리 최적화

대규모 테이블에서 GROUP BY와 집계 함수(AVG, SUM, COUNT 등)를 사용할 때는 인덱스나 쿼리 최적화를 고려해야 성능을 개선할 수 있습니다. 예를 들어, review와 ranking에 인덱스를 걸어두면 집계 성능이 향상됩니다.


✅ "이렇게 질문하면 좋아!"

❌ "왜 AVG에서 오류가 나요?" → 단순한 문제 설명을 받을 수 있습니다.

✅ "MySQL에서 AVG와 GROUP BY를 사용할 때, 비집계 컬럼도 함께 출력하려면 어떻게 해야 하나요?" → 구체적인 해결책(GROUP BY 및 집계 함수 사용법)을 제공받을 수 있습니다.


✅ 결론

Error Code: 1055는 MySQL의 ONLY_FULL_GROUP_BY 모드에서 발생하는 오류입니다. 이를 해결하려면 title을 GROUP BY에 포함시키거나, title을 집계 함수로 처리하여 문제를 해결할 수 있습니다. 실무에서 이 오류를 피하려면 GROUP BY 구문에 필요한 컬럼을 명확히 정의하거나, 집계 함수를 적절히 활용하는 것이 중요합니다. 이를 통해 SQL 모드와 그룹화에 대해 더 잘 이해하고 실무에서 유용하게 사용할 수 있을 것입니다! 🚀

'기술블로그' 카테고리의 다른 글

📌 My Sql에서 가장 많은 책을 출판한 저자의 최근 출판된 책 찾기  (0) 2025.03.25
📌서브쿼리의 기본 원리  (0) 2025.03.25
📌 Select *와 Select 컬럼 지정의 차이점: 성능 최적화와 효율적인 쿼리 작성  (0) 2025.03.25
📌 My Sql에서 부분 일치 검색으로 중복 데이터 제거하기  (0) 2025.03.25
📌 MySQL 테이블에서 중복된 데이터를 효과적으로 삭제하는 방법  (0) 2025.03.25
'기술블로그' 카테고리의 다른 글
  • 📌 My Sql에서 가장 많은 책을 출판한 저자의 최근 출판된 책 찾기
  • 📌서브쿼리의 기본 원리
  • 📌 Select *와 Select 컬럼 지정의 차이점: 성능 최적화와 효율적인 쿼리 작성
  • 📌 My Sql에서 부분 일치 검색으로 중복 데이터 제거하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (597) N
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (10)
      • 특강 (29)
      • 기술블로그 (32)
      • 기술블로그-Django편 (136) N
      • 기술블로그-Flask편 (35)
      • AI 분석 (4) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (61)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 MySQL Group By와 집계 함수 활용(Error Code 1055 해결 방법)
상단으로

티스토리툴바