목차
GROUP BY
GROUP BY는 특정 컬럼의 값에 따라 데이터를 그룹으로 묶고, 각 그룹에 대해 집계 함수(Aggregate Function)를 적용할 때 사용된다.
"같은 값끼리 묶고 -> 집계(합계, 평균, 개수 등)하자"는 개념으로 이해하자 |
집계 함수
함수 | 의미 |
COUNT(*) | 테이블 전체 행(Row) 수를 반환 * NULL 포함 모든 행 계산 |
COUNT(컬럼) | 해당 컬럼의 NULL이 아닌 행만 세어서 반환 |
COUNT(DISTINCT 컬럼) | 해당 컬러멩서 중복을 제거와 NULL을 제외한 개수 반환 |
SUM(컬럼) | 해당 컬럼 값들의 합계를 반환 |
AVG(컬럼) | 해당 컬럼 값들의 평균값을 반환 |
MIN(컬럼) | 해당 컬럼 값들 중 최소값을 반환 |
MAX(컬럼) | 해당 컬럼 값들 중 최대값을 반환 |
- SUM, AVG, MIN, MAX는 숫자형 컬럼에 주로 사용되며, MIN, MAX는 문자열에서도 사전 순 비교가 가능해.
- COUNT(*)는 NULL
HAVING
HAVING은 그룹화된 결과(집계 결과)에 조건을 거는 절이다.
즉, WHERE이 개별 행(Row)에 대한 조건이라면, HAVING은 그룹(GROUP)에 대한 조건이다. |
✅ 기본 문법
SELECT 그룹컬럼, 집계함수
FROM 테이블명
GROUP BY 그룹컬럼
HAVING 조건;
HAVING은 GROUP BY 절 이후에 수행되기 때문에 그룹핑 후에 가능한 집계 함수로 조건을 부여한다.
✅ 예제 1: 부서별 평균 급여가 3000 이상인 부서만 조회
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 3000;
→ WHERE으로는 AVG(salary) 같은 집계 결과를 필터링할 수 없고, 반드시 HAVING을 사용해야한다.
✅ 예제 2: 성별별 사용자 수가 5명 이상인 경우만
SELECT gender, COUNT(*) AS 인원수
FROM users
GROUP BY gender
HAVING COUNT(*) >= 5;
✅ WHERE + HAVING 같이 쓰는 예
-- 30세 이상 회원만 대상으로 성별별 평균 점수 구하되, 평균이 70점 이상인 경우만
SELECT gender, AVG(score) AS 평균
FROM users
WHERE age >= 30
GROUP BY gender
HAVING AVG(score) >= 70;
→
- 먼저 WHERE로 나이 30세 이상 필터링
- GROUP BY로 성별 그룹화
- HAVING으로 평균이 70 이상인 그룹만 남김
✅ WHERE vs HAVING 차이
항목 | WHERE | HAVING |
필터링 대상 | 행 | 그룹 |
사용 시점 | GROUP BY 이전 | GROUP BY 이후 |
집계 함수 사용 | 안됨. | 가능 |
예시 | WHERE age > 30 | HAVING AVG(score) > 80 |
728x90
'SQL > SQLD' 카테고리의 다른 글
#14 JOIN (0) | 2025.04.13 |
---|---|
#13 ORDER BY (0) | 2025.04.13 |
#11 WHERE 절 (0) | 2025.04.10 |
#10 함수 (0) | 2025.04.10 |
#9 SQL (0) | 2025.04.07 |