Dende
[SQLD] GROUP BY 룰 본문
SELECT 절에는
- GROUP BY 뒤에서 사용한 컬럼들 또는
- COUNT(), MAX() 등과 같은 집계 함수만
쓸 수 있다는 규칙입니다. 이건 거꾸로 말해 GROUP BY 뒤에 쓰지 않은 컬럼 이름을 SELECT 뒤에 쓸 수는 없다는 말입니다.
그런데 GROUP BY 뒤에 쓰지 않은, 그러니까 그루핑 기준으로 사용하지 않은 컬럼명을 SELECT 절 뒤에 써서 조회하려고 하면,각 그룹의 row들 중에서 해당 컬럼의 값을 어느 row에서 가져와야할지 결정할 수가 없습니다.
예를 들어, 위 SQL 문에서 제가 그루핑 기준으로 사용하지 않은 age라는 컬럼명을 SELECT 문 뒤에 붙이면 ?

각 그룹에 속한 여러 row들에서 어떤 row의 age 컬럼의 값을 출력해야하는지 결정할 수가 없습니다. 그래서 이 SQL 문을 실행하면 다음과 같은 에러 메시지를 볼 수 있습니다.
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'copang_main.member.age' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
이 에러 메시지의 내용을 요약하면, 그루핑 기준으로 사용되지 않은 컬럼(nonaggregated column)이 SELECT 절에 존재하면 안 된다는 뜻입니다.
age 컬럼은 그루핑 기준으로 쓰지 않았는데 SELECT 뒤에 써서 그 값을 조회하려고 하니 에러가 난 겁니다. GROUP BY를 사용할 때는 이 사용 규칙을 반드시 기억하셔야 합니다.
그런데 위 규칙을 보면 (2) COUNT(), MAX() 등과 같은 집계 함수는 사용할 수 있다는 내용이 있습니다.

SELECT 절 뒤에 age를 바로 쓰는 건 안 되지만, AVG(age)처럼 집계 함수의 인자로 사용하는 건 괜찮습니다. 왜냐하면 이렇게 하면 각 그룹에서 특정 row의 age 값을 보여주는 게 아니라 그냥 각 그룹 내 모든 row들의 age 컬럼의 값의 평균값을 구하면 되기 때문입니다. 즉, 그루핑 기준으로 사용하지 않은 컬럼이라도 SELECT 절 뒤에서 집계 함수의 인자로는 사용할 수 있는 겁니다.
- GROUP BY 절 뒤에 쓴 컬럼 이름들만, SELECT 절 뒤에도 쓸 수 있다.
- 대신 SELECT 절 뒤에서 집계 함수에 그 외의 컬럼 이름을 인자로 넣는 것은 허용된다.
'SQLD' 카테고리의 다른 글
| [SQLD] 서브쿼리 (0) | 2022.08.23 |
|---|---|
| [SQLD] DROP, DELETE, TRUNCATE의 차이점 (0) | 2022.08.23 |
| [SQLD] Group By와 Having (0) | 2022.08.22 |
| [SQLD] SQL 과목 (0) | 2022.08.21 |
| 2일차 (0) | 2022.08.19 |