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)
'Database > MySQL' 카테고리의 다른 글
MySQL) 서브쿼리 : SELECT, FROM, WHERE 절에서의 사용법과 예제 (0) | 2025.02.09 |
---|---|
MySQL) JOIN 정리 : inner, left, right, full, cross, self (1) | 2025.02.06 |
MySQL) order by : sorting(오름, 내림) 정렬 (0) | 2025.02.04 |
MySQL) where절 정리 : ALL, ANY, IN, EXISTS, BETWEEN / IF, IFNULL, NVL (0) | 2025.02.04 |
MySQL) 쿼리로 테이블 만들기 및 조회하기 기초 : Create, Select (0) | 2025.02.04 |