📌 개념 정리
이번 포스팅에서는 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 테이블에 다음과 같은 데이터가 있다고 가정하자:
책 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 고급 팁 – 개발자 성장에 도움 되는 활용법
- 🔥 GROUP_CONCAT의 성능 고려
- GROUP_CONCAT은 많은 데이터를 결합할 때 메모리 사용이 커질 수 있으므로, 데이터의 양을 고려해 사용할 필요가 있어. 이 함수는 기본적으로 3,072자까지만 반환하므로, 길이가 긴 문자열을 다룰 때는 group_concat_max_len 설정을 늘려줘야 할 수도 있음.
- ✅ 구분자 변경
- GROUP_CONCAT에서 기본 구분자 쉼표 외에 다른 구분자를 사용하고 싶다면 SEPARATOR 키워드를 사용할 수 있어. 예를 들어, |를 구분자로 사용하고 싶다면 GROUP_CONCAT(title SEPARATOR '|')로 쓸 수 있어.
- 🚀 대규모 데이터에서의 성능 최적화
- 대용량 데이터에서 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 |