참고 링크 : https://velog.io/@devjooj/MySQL-EP-1.-GROUP-BY
[MySQL] GROUP BY 왜 안 되는거야?
갑자기 잘 작동하던 프로시저가 sql_mode 활성화 후 error가 났다. 왜 갑자기?!
velog.io
입사 후 처음 DB관련 작업을 하다가
GROUP BY 함수를 쓰는데 처음보는 에러가 떠서 찾아보다가 잘 정리된 글이 있어서 업로드
Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column '컬럼명' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
위에 링크에선 3가지 방법을 설명해준다
✏️ 에러 해결 방법
해당 에러를 해결하기 위해서는 두가지의 해결 방법이 있다.
1. Query 수정
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
위 예시는 GROUP BY로 o.custid를 그룹화하여 SELECT하는 쿼리이다.
이렇게 작성하면 위의 에러가 나올 것이다.
뭐가 잘못된 걸까?
GROUP BY를 사용할 경우, SELECT 할 수 있는 컬럼은
- GROUP BY에 나열된 컬럼 (여기서는 o.custid)
- COUNT(), AVG(), SUM()과 같은 집계함수
위의 두가지 경우에만 사용할 수 있다.
그렇다면 다시 위의 쿼리로 돌아갔을 때 잘못된 점이 보일 것이다.
GROUP BY에 선언되지 않은 컬럼, 집계함수도 아닌 컬럼인 c.name으로 인해 문제가 발생한 것이다.
문제를 해결하기 위해서는
해결1. 아래와 같이 비집계 컬럼인 c.name을 GROUP BY에 추가
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
//GROUP BY o.custid
GROUP BY o.custid, c.name
해결2. 어떠한 값이 와도 상관이 없다면 ANY_VALUE() 함수 사용
SELECT
o.custid
, ANY_VALUE(c.name)
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid
2. sql_mode 옵션 중 only_full_group_by 비활성화
- 실제로 해결방법으로 공식문서에도 비활성화하라고 나와있다.
여기까지 MySQL 공식문서에 나와있는 GROUP BY 규칙이었다.
나 같은 경우 기본적으로 세팅되어있는 sql_mode 옵션을 건드릴 수 없으니 2번 방식은 선택하지 못했고
해결1 방식으로 했었는데
해결2 방식을 이번에 알게되서 다시 보기 위해 포스팅
상황에 맞게 선택해서 작업하면 될 것 같다
'DB > MySQL' 카테고리의 다른 글
MySQL 다운로드 (0) | 2023.05.08 |
---|
참고 링크 : https://velog.io/@devjooj/MySQL-EP-1.-GROUP-BY
[MySQL] GROUP BY 왜 안 되는거야?
갑자기 잘 작동하던 프로시저가 sql_mode 활성화 후 error가 났다. 왜 갑자기?!
velog.io
입사 후 처음 DB관련 작업을 하다가
GROUP BY 함수를 쓰는데 처음보는 에러가 떠서 찾아보다가 잘 정리된 글이 있어서 업로드
Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column '컬럼명' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
위에 링크에선 3가지 방법을 설명해준다
✏️ 에러 해결 방법
해당 에러를 해결하기 위해서는 두가지의 해결 방법이 있다.
1. Query 수정
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
위 예시는 GROUP BY로 o.custid를 그룹화하여 SELECT하는 쿼리이다.
이렇게 작성하면 위의 에러가 나올 것이다.
뭐가 잘못된 걸까?
GROUP BY를 사용할 경우, SELECT 할 수 있는 컬럼은
- GROUP BY에 나열된 컬럼 (여기서는 o.custid)
- COUNT(), AVG(), SUM()과 같은 집계함수
위의 두가지 경우에만 사용할 수 있다.
그렇다면 다시 위의 쿼리로 돌아갔을 때 잘못된 점이 보일 것이다.
GROUP BY에 선언되지 않은 컬럼, 집계함수도 아닌 컬럼인 c.name으로 인해 문제가 발생한 것이다.
문제를 해결하기 위해서는
해결1. 아래와 같이 비집계 컬럼인 c.name을 GROUP BY에 추가
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
//GROUP BY o.custid
GROUP BY o.custid, c.name
해결2. 어떠한 값이 와도 상관이 없다면 ANY_VALUE() 함수 사용
SELECT
o.custid
, ANY_VALUE(c.name)
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid
2. sql_mode 옵션 중 only_full_group_by 비활성화
- 실제로 해결방법으로 공식문서에도 비활성화하라고 나와있다.
여기까지 MySQL 공식문서에 나와있는 GROUP BY 규칙이었다.
나 같은 경우 기본적으로 세팅되어있는 sql_mode 옵션을 건드릴 수 없으니 2번 방식은 선택하지 못했고
해결1 방식으로 했었는데
해결2 방식을 이번에 알게되서 다시 보기 위해 포스팅
상황에 맞게 선택해서 작업하면 될 것 같다
'DB > MySQL' 카테고리의 다른 글
MySQL 다운로드 (0) | 2023.05.08 |
---|