SQL/SQLD

#12 GROUP BY, HAVING 절

sundori 2025. 4. 13. 12:15

목차

    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;

    1. 먼저 WHERE로 나이 30세 이상 필터링
    2. GROUP BY로 성별 그룹화
    3. 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