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