SQLSQL 기초강의 8개 중 4번째난이도 입문

집계 함수와 GROUP BY — 통계 계산하기

발행 읽는 시간 약 1 분

  • SQL
  • GROUP BY
  • COUNT
  • SUM
  • AVG
  • HAVING

강의 소개

COUNT, SUM, AVG, MAX, MIN으로 집계를 계산하고, GROUP BY로 그룹별 통계를 내는 방법을 배웁니다. HAVING으로 그룹 조건을 필터링하는 것도 익힙니다.

집계 함수#

SQL
-- 전체 행 수
SELECT COUNT(*) FROM employees;                -- 6

-- 특정 열 값이 있는 행 수 (NULL 제외)
SELECT COUNT(department) FROM employees;

-- 합계
SELECT SUM(salary) FROM employees;             -- 30200000

-- 평균
SELECT AVG(salary) FROM employees;             -- 5033333.33

-- 최대/최소
SELECT MAX(salary), MIN(salary) FROM employees;

-- 한 번에 여러 집계
SELECT
    COUNT(*) AS 직원수,
    SUM(salary) AS 급여총액,
    ROUND(AVG(salary), 0) AS 평균급여,
    MAX(salary) AS 최고급여,
    MIN(salary) AS 최저급여
FROM employees;

GROUP BY: 그룹별 집계#

SQL
-- 부서별 인원 수
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

-- 결과
-- department | headcount
-- -----------|----------
-- 개발팀      | 3
-- 마케팅팀    | 2
-- 디자인팀    | 1

-- 부서별 평균 급여
SELECT
    department,
    COUNT(*) AS headcount,
    ROUND(AVG(salary), 0) AS avg_salary,
    SUM(salary) AS total_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC;

HAVING: 그룹 조건 필터링#

WHERE는 행을 필터링, HAVING은 그룹을 필터링합니다.

SQL
-- 인원 2명 이상인 부서만
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) >= 2;

-- 평균 급여 500만 이상 부서
SELECT department, ROUND(AVG(salary), 0) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000000;

WHERE vs HAVING#

SQL
-- WHERE: GROUP BY 전에 적용 (원본 행 필터)
-- HAVING: GROUP BY 후에 적용 (그룹 필터)

-- 활성 직원만 대상으로 → 부서별 집계 → 인원 2명 이상 필터
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE is_active = TRUE          -- 행 필터 (GROUP BY 전)
GROUP BY department
HAVING COUNT(*) >= 2;           -- 그룹 필터 (GROUP BY 후)

SELECT 실행 순서#

Diagram · Mermaid

집계 + JOIN 조합#

SQL
-- 고객별 주문 총액 (상위 5명)
SELECT
    c.name,
    COUNT(o.id) AS order_count,
    SUM(o.amount) AS total_spent
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name
ORDER BY total_spent DESC NULLS LAST
LIMIT 5;

ROLLUP: 소계 포함#

SQL
-- 부서별 소계 + 전체 합계
SELECT
    COALESCE(department, '전체') AS department,
    SUM(salary) AS total_salary
FROM employees
GROUP BY ROLLUP(department);

-- 결과
-- department | total_salary
-- -----------|-------------
-- 개발팀      | 17300000
-- 디자인팀    | 4800000
-- 마케팅팀    | 8100000
-- 전체        | 30200000   ← ROLLUP이 추가한 전체 합계

정리#

함수/절역할
COUNT(*)행 수
SUM(col)합계
AVG(col)평균
MAX/MIN(col)최대/최소
GROUP BY col그룹화
HAVING 조건그룹 조건 필터
ROUND(n, d)소수점 반올림

다음 편에서는 서브쿼리 — 쿼리 안에 쿼리를 넣어 복잡한 조건을 처리하는 방법을 배웁니다.

Follow · Ask · Work

이 글이 도움이 됐다면

짧은 작업 기록과 데모는 인스타그램에 올립니다. 만들고 싶은 것이 있다면 프로젝트 의뢰나 협업 제안도 편하게 보내 주세요.

글쓴이

파란여우

직접 만든 AI 앱·제품의 개발·배포를 공개하는 실전형 테크 크리에이터

파란여우 소개 Instagram @bluefox._.hi

이어서 보기

만들고 싶은 것이 있다면 프로젝트 의뢰로 알려 주세요.