[태그:] 집계함수

  • 데이터 요약의 마술사, SQL 그룹 함수(Group Function)로 데이터를 압축하다

    데이터 요약의 마술사, SQL 그룹 함수(Group Function)로 데이터를 압축하다

    우리가 매일 접하는 수많은 데이터는 그 자체로는 거대한 정보의 홍수에 불과합니다. “전체 직원의 평균 급여는 얼마일까?”, “각 부서별로 직원이 몇 명이나 있을까?”, “지난 분기에 가장 높은 매출을 기록한 상품은 무엇일까?” 와 같은 의미 있는 인사이트를 얻기 위해서는 원본 데이터를 요약하고 집계하는 과정이 필수적입니다. SQL에서 이러한 데이터 요약의 핵심적인 역할을 수행하는 것이 바로 ‘그룹 함수(Group Function)’입니다.

    그룹 함수는 여러 행(Row)의 데이터를 입력으로 받아들여 단 하나의 결과 값을 반환하는 함수입니다. 집계 함수(Aggregate Function)라고도 불리며, 전체 데이터셋이나 특정 그룹에 대한 통계적인 정보를 계산하는 데 사용됩니다. 이는 개별 데이터 하나하나를 살펴보는 ‘나무’가 아닌, 데이터 전체의 패턴과 특징을 파악하는 ‘숲’을 볼 수 있게 해주는 강력한 도구입니다. 이 글에서는 SQL의 가장 기본이면서도 중요한 그룹 함수의 종류와 사용법, 그리고 그룹 함수의 단짝인 GROUP BY 절에 대해 심도 있게 알아보겠습니다.

    대표적인 그룹 함수들: 데이터의 속살을 들여다보는 5가지 도구

    SQL에는 다양한 그룹 함수가 있지만, 가장 기본적이고 널리 사용되는 5가지 함수만 알아도 대부분의 데이터 집계 요구사항을 해결할 수 있습니다.

    1. COUNT(): 행의 개수를 세다

    COUNT() 함수는 지정된 조건에 맞는 행의 개수를 반환합니다. 가장 기본적인 데이터 집계 함수입니다.

    • COUNT(*): NULL 값을 포함한 모든 행의 개수를 계산합니다. 테이블의 전체 레코드 수를 확인할 때 가장 일반적으로 사용됩니다.
    • COUNT(컬럼명): 해당 컬럼에서 NULL이 아닌 값을 가진 행의 개수만 계산합니다.
    • COUNT(DISTINCT 컬럼명): 해당 컬럼에서 중복을 제거한 유니크한 값의 개수를 계산합니다.

    활용 예시:

    SQL

    -- 전체 직원 수 계산
    SELECT COUNT(*) FROM employees;
    
    -- 보너스를 받는 직원 수 계산 (bonus 컬럼이 NULL이 아닌 경우)
    SELECT COUNT(bonus) FROM employees;
    
    -- 회사의 전체 부서 수 계산 (중복 제거)
    SELECT COUNT(DISTINCT department_id) FROM employees;
    

    2. SUM(): 합계를 구하다

    SUM() 함수는 숫자 데이터 타입의 컬럼 값들의 총합을 계산하여 반환합니다.

    활용 예시:

    SQL

    -- 전 직원의 월 급여 총액 계산
    SELECT SUM(salary) FROM employees;
    
    -- '영업부' 소속 직원들의 연간 총 매출액 계산
    SELECT SUM(annual_sales) FROM employees WHERE department_name = '영업부';
    

    3. AVG(): 평균을 구하다

    AVG() 함수는 숫자 데이터 타입의 컬럼 값들의 평균을 계산하여 반환합니다. 내부적으로는 SUM(컬럼) / COUNT(컬럼)으로 동작하며, COUNT와 마찬가지로 NULL 값은 계산에서 제외됩니다.

    활용 예시:

    SQL

    -- 전 직원의 평균 급여 계산
    SELECT AVG(salary) FROM employees;
    
    -- 30대 직원들의 평균 보너스 금액 계산
    SELECT AVG(bonus) FROM employees WHERE age >= 30 AND age < 40;
    

    4. MAX(): 최댓값을 찾다

    MAX() 함수는 지정된 컬럼에서 가장 큰 값을 찾아 반환합니다. 숫자, 문자열, 날짜 등 다양한 데이터 타입에 사용할 수 있습니다.

    활용 예시:

    SQL

    -- 회사에서 가장 높은 급여액 찾기
    SELECT MAX(salary) FROM employees;
    
    -- 가장 최근에 입사한 직원의 입사일 찾기
    SELECT MAX(hire_date) FROM employees;
    

    5. MIN(): 최솟값을 찾다

    MIN() 함수는 MAX()와 반대로 지정된 컬럼에서 가장 작은 값을 찾아 반환합니다.

    활용 예시:

    SQL

    -- 회사에서 가장 낮은 급여액 찾기
    SELECT MIN(salary) FROM employees;
    
    -- 알파벳 순으로 가장 이름이 빠른 직원 찾기
    SELECT MIN(emp_name) FROM employees;
    
    함수설명NULL 값 처리
    COUNT()행의 개수를 계산COUNT(*)는 포함, COUNT(컬럼)은 제외
    SUM()숫자 값의 총합을 계산계산에서 제외
    AVG()숫자 값의 평균을 계산계산에서 제외
    MAX()가장 큰 값을 반환비교에서 제외
    MIN()가장 작은 값을 반환비교에서 제외

    그룹 함수의 필수 파트너: GROUP BY와 HAVING

    위에서 설명한 그룹 함수들은 테이블 전체를 대상으로 하나의 값을 반환했습니다. 하지만 우리가 정말 원하는 것은 ‘각 부서별’ 평균 급여, ‘직급별’ 직원 수와 같이 특정 그룹별로 집계된 통계 정보인 경우가 많습니다. 이때 사용하는 것이 바로 GROUP BY 절입니다.

    GROUP BY: 데이터 묶어주기

    GROUP BY 절은 특정 컬럼의 값이 같은 행들을 하나의 그룹으로 묶어주는 역할을 합니다. 이렇게 생성된 각 그룹에 대해 그룹 함수가 적용되어, 그룹별로 하나의 요약된 결과 행을 반환합니다.

    문법 규칙:

    GROUP BY 절을 사용할 때 SELECT 목록에는 다음 두 종류의 표현식만 올 수 있습니다.

    1. GROUP BY 절에 명시된 컬럼
    2. 그룹 함수 (COUNT, SUM, AVG 등)

    GROUP BY에 포함되지 않은 일반 컬럼(예: emp_name)을 SELECT 목록에 쓰면, 어떤 그룹의 emp_name을 대표로 보여줘야 할지 알 수 없기 때문에 오류가 발생합니다.

    활용 예시: 각 부서(department_id)별 직원 수와 평균 급여 계산

    SQL

    SELECT
        department_id,  -- 1. GROUP BY에 명시된 컬럼
        COUNT(*) AS "부서별 인원",  -- 2. 그룹 함수
        ROUND(AVG(salary)) AS "부서별 평균 급여" -- 2. 그룹 함수
    FROM
        employees
    GROUP BY
        department_id; -- department_id가 같은 행들을 하나의 그룹으로 묶음
    

    이 쿼리는 먼저 department_id를 기준으로 직원들을 그룹으로 나눈 뒤, 각 부서 그룹별로 직원 수를 세고 평균 급여를 계산하여 보여줍니다.

    HAVING: 그룹에 대한 조건 걸기

    WHERE 절이 개별 행에 대한 조건을 걸어 필터링하는 역할을 한다면, HAVING 절은 GROUP BY에 의해 생성된 그룹에 대한 조건을 걸어 필터링하는 역할을 합니다. 즉, HAVING 절은 반드시 GROUP BY 절 뒤에 위치해야 합니다.

    WHERE vs. HAVING:

    • WHERE: 그룹화하기 전, 원본 테이블의 개별 행을 필터링한다. (그룹 함수 사용 불가)
    • HAVING: 그룹화가 완료된 후, 집계된 결과 그룹을 필터링한다. (그룹 함수 사용 가능)

    활용 예시: 평균 급여가 10000 이상인 부서만 조회하기

    SQL

    SELECT
        department_id,
        AVG(salary) AS avg_salary
    FROM
        employees
    GROUP BY
        department_id
    HAVING
        AVG(salary) >= 10000; -- 그룹화된 결과에 대해 조건 적용
    

    이 쿼리는 먼저 부서별로 평균 급여를 모두 계산한 뒤(GROUP BY), 그 결과 중에서 평균 급여가 10000 이상인 그룹만 남겨서 보여줍니다. 이 조건은 개별 행에는 적용할 수 없고 오직 그룹에만 적용할 수 있으므로 WHERE가 아닌 HAVING을 사용해야 합니다.


    결론: 데이터 분석의 첫걸음, 요약과 집계

    그룹 함수와 GROUP BY 절은 방대한 원본 데이터를 의미 있는 정보로 요약하고 집계하는 가장 기본적인 SQL 기술입니다. 단순히 전체 합계나 평균을 구하는 것을 넘어, 데이터를 다양한 기준으로 그룹화하고 각 그룹의 통계적 특성을 비교 분석함으로써 우리는 데이터 속에 숨겨진 패턴과 인사이트를 발견할 수 있습니다.

    • **COUNT, SUM, AVG, MAX, MIN**으로 데이터의 전체적인 특징을 파악하고,
    • **GROUP BY**를 사용해 데이터를 의미 있는 단위로 분할하여 분석의 깊이를 더하며,
    • **HAVING**으로 분석하고자 하는 그룹의 조건을 명시합니다.

    이 세 가지 개념의 조합은 모든 데이터 분석의 출발점이라고 해도 과언이 아닙니다. 비즈니스 리포트 작성, 데이터 시각화를 위한 기초 데이터 가공, 머신러닝 모델을 위한 피처 엔지니어링 등 데이터가 사용되는 거의 모든 영역에서 그룹 함수는 핵심적인 역할을 수행합니다. 이 기본기를 탄탄히 다지는 것이 곧 데이터 전문가로 성장하는 가장 확실한 지름길일 것입니다.