본문 바로가기

Language/MySQL

[MySQL] 그룹화 - GROUP BY

[SYNTAX]
SELECT * FROM 테이블명 GROUP BY 열 1, 열 2,...

 

GROUP BY로 그룹화를 통해 집계 함수로 넘겨줄 집합을 그룹으로 나눌 수 있고,  집계 함수의 활용 범위를 넓힐 수 있다.

GROUP BY구에서는 그룹화할 열을 지정한다. 물론 복수로도 지정이 가능하다.

위의 결과를 보면 DISTINCT를 지정했을 때와 같은 결과가 나온다.

GROUP BY구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶인다.

각 그룹으로 묶인 값들은 서로 동일하다. 즉, 결과적으로는 각각의 그룹 값이 반환되며, DISTINCT와 같이 중복을 제거하는 효과가 있다.

GROUP BY 구를 지정하는 경우 집계 함수와 함께 사용하지 않으면 별 의미가 없다.

 

 

HAVING 구로 조건 지정하기

위처럼 집계 함수는 WHERE 구의 조건식에서는 사용할 수 없다.

에러가 발생한 이유는 GROUP BY와 WHERE 구의 내부 처리 순서와 관계가 있다. 

WHERE구로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 순서상 앞서기 때문이다.

[ 내부 처리 순서 ]
WHERE 구 → GROUP BY 구 → SELECT 구 → ORDER BY 구

 

그렇다면, 집계한 결과에서 조건에 맞는 값을 걸러내려면 HAVING 구로 걸러내면 된다.

HAVING 구는 GROUP BY 구 뒤에 기술하여 WHERE 구와 동일하게 조건식을 지정할 수 있다. 이때 조건식이 참인 그룹 값만 클라이언트에게 반환된다.

 

 

GROUP BY를 사용할 때 주의점이 하나 더 있다.

GROUP BY에 지정한 열 이외의 열은 집계 함수를 사용하지 않은 채 SELECT 구에 기술해서는 안된다.

데이터베이스 제품에 따라 에러가 날 수도 있지만 위처럼 그룹별로 하나의 값만 반환해야 하기 때문에 맨 위의 열만 반환되는 것을 볼 수 있다.

이럴 경우 집계 함수를 사용하게 되면 집합은 하나의 값으로 계산되므로 그룹마다 하나의 행을 출력할 수 있다.

 

 

GROUP BY로 그룹화해도 실행결과 순서를 정렬할 수는 없다. 출력내용을 정렬하고 싶다면 ORDER BY를 이용하면 된다.

'Language > MySQL' 카테고리의 다른 글

[MySQL] 상관 서브쿼리  (0) 2022.11.20
[MySQL] 서브쿼리  (0) 2022.11.17
[MySQL] COUNT 이외의 집계 함수  (0) 2022.11.11
[MySQL] 행 개수 구하기 - COUNT  (1) 2022.11.04
[MySQL] 물리삭제와 논리삭제  (0) 2022.10.10