카테고리 별로 연산을 하고 싶을 때는 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 절은 그룹에 적용되는 조건과 함께 사용된다는 점입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


목차