SQL 그룹화 함수 : GROUP BY

카테고리 별로 연산을 하고 싶을 때는 group by 문을 사용하면 됩니다.

이번 포스트에서는 group by를 사용하는 경우와, 사용법, 그룹 조건절에 대해서 간단히 정리해보았습니다.

GROUP BY 를 사용하는 경우

WHERE 절만을 사용하여 카테고리 별 연산을 할 수 있습니다.

하지만 이런 쿼리문은 총 쿼리문을 길게 만듭니다.

예를 들어 특정 카테고리의 합계를 구한다고 했을 때, 해당 카테고리의 값이 3개만 존재한다고 해도 아래 같이 입력해야 합니다.

select 카테고리컬럼, 
       sum(계산 컬럼),
from 테이블명 
where 카테고리컬럼 = 카테고리값1;

select 카테고리컬럼, 
       sum(계산 컬럼),
from 테이블명 
where 카테고리컬럼 = 카테고리값2;

select 카테고리컬럼, 
       sum(계산 컬럼),
from 테이블명 
where 카테고리컬럼 = 카테고리값3;

하지만 GROUP BY를 사용하면 그룹별 연산이 한 줄의 쿼리로 완성됩니다.

select 카테고리컬럼,
       sum(계산 컬럼),
from 테이블명
group by 카테고리컬럼;

GROUP BY 의 조건절 : HAVING 문

그룹에 대한 조건은 HAVING 문을 사용합니다.

WHERE 문에는 기본적으로 집계함수를 사용할 수 없고 그룹에 대한 조건이 아니기 때문에 그룹화 결과에 대한 조건은 HAVING 문을 사용해야 합니다.

카테고리 별로 데이터의 수가 10개 초과인 것만 조회한다고 하면 아래와 같이 작성합니다.

SELECT [칼럼명1], COUNT(*)
FROM [테이블명] 
GROUP  BY [칼럼명1] 
HAVING COUNT(*)>10;

HAVING의 위치GROUP BY의 뒤 ORDER BY의 앞입니다.

순서를 정리하자면 아래와 같습니다

SELECT
FROM
WHERE
GROUP BY
ORDER BY

HAVING절과 WHERE 절의 차이

SQL에서 HAVING 절과 WHERE 절은 모두 쿼리에서 반환된 행을 필터링하는 데 사용되지만 서로 다른 컨텍스트에서 사용되며 서로 다른 유형의 조건에서 작동합니다.

WHERE 절은 그룹화 및 집계되기 전에 행을 필터링하는 데 사용됩니다.

SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE salary > 50000
GROUP BY department;

이 예에서 ‘WHERE’ 절은 각 부서에 대한 ‘AVG’ 집계가 계산되기 전에 급여가 50000 이하인 행을 필터링합니다.

HAVING 절은 그룹화가 적용된 후 집계 함수(예: SUM, AVG, COUNT)의 결과를 필터링하는 데 사용됩니다. GROUP BY 절과 함께 사용됩니다.

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000

이 예에서 ‘HAVING’ 절은 각 그룹에 대해 ‘AVG’를 계산한 후 평균 급여가 50000 이하인 그룹(부서)을 필터링합니다.

주요 차이점은 WHERE 절은 개별 행에 적용되는 조건과 함께 사용된다는 점.

HAVING 절은 그룹에 적용되는 조건과 함께 사용된다는 점입니다.

Leave a Comment

목차