Notice
Recent Posts
Recent Comments
Link
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

Dende

[SQLD] GROUP BY 룰 본문

SQLD

[SQLD] GROUP BY 룰

Dende 2022. 8. 23. 00:57

SELECT 절에는

  1. GROUP BY 뒤에서 사용한 컬럼들 또는
  2. 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 절 뒤에서 집계 함수의 인자로는 사용할 수 있는 겁니다.

 

  1. GROUP BY 절 뒤에 쓴 컬럼 이름들만, SELECT 절 뒤에도 쓸 수 있다.
  2. 대신 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