SQL GROUP BY와 HAVING 활용 가이드

유방현·2024년 10월 29일

SQL GROUP BY와 HAVING 활용 가이드

1. GROUP BY 기본 구문

단일 열 그룹화

-- 기본 구문
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;

-- 예: 부서별 직원 수
SELECT deptno, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno;

다중 열 그룹화

-- 기본 구문
SELECT column1, column2, aggregate_function(column_name)
FROM table_name
GROUP BY column1, column2;

-- 예: 부서 및 직책별 직원 수
SELECT deptno, job, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno, job;

2. 집계 함수와 GROUP BY 활용

기본 집계 예제

-- 직책별 평균 급여
SELECT job, TRUNCATE(AVG(sal), 1) AS 평균_급여
FROM emp
GROUP BY job;

-- 부서별 최고 급여
SELECT deptno, MAX(sal) AS 최고급여
FROM emp
GROUP BY deptno;

복합 집계 예제

-- 부서, 직책별 급여 합계
SELECT deptno, job, SUM(sal) AS 급여합계
FROM emp
GROUP BY deptno, job;

-- 정렬 추가
SELECT deptno, job, SUM(sal) AS 급여합계
FROM emp
GROUP BY deptno, job
ORDER BY SUM(sal) DESC;

3. HAVING 절 활용

기본 HAVING 사용

-- 직원수가 3명 이상인 부서
SELECT deptno, COUNT(*) AS 직원_수
FROM emp
GROUP BY deptno
HAVING COUNT(*) >= 3;

-- 급여 합계가 2000 이상인 부서/직책 그룹
SELECT deptno, job, SUM(sal) AS 급여합계
FROM emp
GROUP BY deptno, job
HAVING SUM(sal) >= 2000;

4. 고급 활용 예제

서브쿼리와 함께 사용

-- 부서별 최고 급여를 받는 사원 조회
SELECT deptno, ename, sal
FROM emp
WHERE (deptno, sal) IN (
    SELECT deptno, MAX(sal)
    FROM emp
    GROUP BY deptno
);

복합 조건 사용

-- 부서별 평균 급여가 2000 이상이고 직원수가 3명 이상인 부서
SELECT 
    deptno,
    COUNT(*) AS 직원수,
    AVG(sal) AS 평균급여
FROM emp
GROUP BY deptno
HAVING AVG(sal) >= 2000 AND COUNT(*) >= 3;

5. 주요 활용 팁

  1. WHERE vs HAVING

    • WHERE: 그룹화 전 필터링
    • HAVING: 그룹화 후 필터링
  2. 정렬 순서

    SELECT ... FROM ...
    WHERE ...
    GROUP BY ...
    HAVING ...
    ORDER BY ...
  3. 집계 함수 사용

    • COUNT(): 행 수 계산
    • SUM(): 합계
    • AVG(): 평균
    • MAX(): 최대값
    • MIN(): 최소값
  4. NULL 처리

    • GROUP BY는 NULL을 하나의 그룹으로 처리
    • 필요시 IFNULL() 함수 사용
  5. 성능 고려사항

    • 그룹화 전 WHERE 절로 필터링하는 것이 더 효율적
    • 인덱스 활용을 위해 GROUP BY 열의 순서 고려

0개의 댓글