Database/MySQL

MySQL) group by, having절 정리 : count, sum, avg, max, min

pogun 2025. 2. 5. 22:02

GROUP BY & HAVING 개념 정리

1. GROUP BY

: 같은 값을 가진 행을 그룹화하는 데 사용됨

: SELECT문의 집계 함수(SUM, AVG, COUNT, MAX, MIN 등)와 함께 사용됨

: 일반적으로 WHERE 절보다 뒤에, ORDER BY 절보다 앞에 위치함

SELECT category, SUM(price) 
FROM products
GROUP BY category;

: category별로 그룹을 나눈 후, price의 합계를 계산

2. HAVING

: GROUP BY로 그룹화한 결과에 조건을 적용할 때 사용됨

: WHERE 절은 개별 행을 필터링하지만, HAVING 절은 집계된 결과를 필터링함

SELECT category, SUM(price) 
FROM products
GROUP BY category
HAVING SUM(price) > 1000;

: category별로 SUM(price)를 구한 후, 그 합이 1000 초과인 경우만 필터링

3. WHERE vs HAVING 차이

구분 WHERE HAVING
필터링 대상 개별 행 그룹화된 결과
집계 함수 사용 가능 여부 불가능 X 가능 O
위치 group by 전에 사용 group by 후에 사용
-- WHERE: 각 행에서 price가 100 이상인 데이터만 그룹화
SELECT category, SUM(price) 
FROM products
WHERE price >= 100 
GROUP BY category;

-- HAVING: 그룹화한 후, 총합이 1000 이상인 그룹만 필터링
SELECT category, SUM(price) 
FROM products
GROUP BY category
HAVING SUM(price) >= 1000;

정리 : 

        group by : 데이터를 그룹화

        having : 그룹화된 데이터에서 조건 필터링

        where : 개별 행 필터링( 집계 함수 사용 불가 )


GROUP BY & HAVING절 사용 예제 : count, sum, avg, max, min

select distinct department_id
from employees;

distinct : 중복 제거(select절에서만 사용 가능)

**알아두면 유용함!!**

select job_id, count(employee_id), 
               sum(salary), 
               avg(salary), 
               max(salary), 
               min(salary)
from employees
where job_id = 'IT_PROG';

: IT_PROG 직군의 직원 수, 총급여, 평균급여, 최고급여, 최저급여를 조회

select job_id, count(employee_id), 
               sum(salary), 
               avg(salary), 
               max(salary), 
               min(salary)
from employees
group by job_id;

: 직군(job_id)별 직원 수, 총급여, 평균급여, 최고급여, 최저급여를 조회

select department_id, count(employee_id)
from employees
group by department_id;

: 부서(department_id)별 직원 수를 조회

select department_id, count(*), 
       truncate(sum(salary), 0), 
       round(avg(salary))
from employees
group by department_id;

: 부서(department_id)별 직원 수, 총급여(소수점 제거), 평균급여(반올림)를 조회

truncate : 소수점 제거

round : 반올림

select truncate(123.4567, 1)
from dual;

: 123.4567을 소수점 첫째 자리까지 절삭(truncate)한 값 조회

결과 -> 123.4

select job_id, count(*), sum(salary) as `합계`
from employees
group by job_id
having `합계` >= 150000;

백틱(``) : 컬럼명이나 별칭을 감쌀 때 사용 -> HAVING에서 별칭을 인식

작은따옴표('') : 문자열을 나나낼 때 사용 -> HAVING에서 인식 불가능

 : HAVING 절에서 별칭을 사용할 경우 백틱(``)을 반드시 사용해야 함

select job_id, count(*), sum(salary) as '합계'
from employees
group by job_id
having sum(salary) < 50000
order by '합계' desc;

: 보통은 그냥 컬럼을 넣음

`합계`  <------> sum(salary)