그룹 함수(Group Functions)는 SQL에서 그룹화된 데이터를 집계할 때 사용하는 함수들입니다. 이 함수들은 데이터를 집계(aggregation)하여 여러 행을 하나의 값으로 변환하는 데 사용됩니다. 예를 들어, 합계, 평균, 최대값, 최소값, 개수 등을 계산할 때 유용하게 사용됩니다.
1. 그룹 함수 (Group Functions)란?
그룹 함수는 여러 행의 데이터를 하나의 값으로 요약해주는 함수들로, 보통 SELECT문에서 사용됩니다.
주요 그룹 함수
- COUNT(): 주어진 컬럼에 대해 행의 개수를 반환합니다.
- 예시: 특정 부서에 속한 직원 수 구하기
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;
- SUM(): 주어진 컬럼의 합계를 계산합니다.
- 예시: 부서별 급여 합계
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
- 예시: 부서별 급여 합계
- AVG(): 주어진 컬럼의 평균값을 계산합니다.
- 예시: 부서별 평균 급여
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;
- 예시: 부서별 평균 급여
- MAX(): 주어진 컬럼의 최댓값을 구합니다.
- 예시: 각 부서의 최고 급여
SELECT department_id, MAX(salary) FROM employees GROUP BY department_id;
- 예시: 각 부서의 최고 급여
- MIN(): 주어진 컬럼의 최솟값을 구합니다.
- 예시: 각 부서의 최저 급여
SELECT department_id, MIN(salary) FROM employees GROUP BY department_id;
- 예시: 각 부서의 최저 급여
2. 그룹 함수가 사용될 수 있는 절 (WHERE, HAVING, GROUP BY)
1) GROUP BY 절에서 그룹 함수 사용
GROUP BY 절은 같은 값끼리 묶어서 집계할 때 사용합니다. 예를 들어, 부서별로 직원들의 평균 급여를 계산할 때 GROUP BY를 사용하여 각 부서로 묶은 후 그 안에서 AVG() 함수로 평균을 계산합니다.
예시: 부서별 평균 급여 계산
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
- 설명: GROUP BY 절을 사용하여 department_id별로 그룹을 묶고, 그 그룹 내에서 AVG(salary) 함수로 급여 평균을 계산합니다.
2) WHERE 절에서 그룹 함수 사용
그룹 함수는 WHERE 절에서는 사용할 수 없습니다. WHERE 절은 데이터가 그룹화되기 전에 필터링을 하므로, 그룹 함수가 적용되기 전에는 값을 계산할 수 없습니다.
잘못된 예시
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 50000 -- 그룹 함수는 WHERE 절에서 사용할 수 없음
GROUP BY department_id;
- 설명: WHERE 절에서 그룹 함수를 사용하면 오류가 발생합니다. 그룹 함수는 그룹화된 데이터를 처리하기 때문에 WHERE에서는 사용할 수 없습니다.
3) HAVING 절에서 그룹 함수 사용
HAVING 절은 그룹화된 데이터에 조건을 적용할 때 사용됩니다. HAVING 절은 GROUP BY 절과 함께 사용되며, 그룹 함수가 적용된 뒤 그 결과를 필터링하는 데 사용됩니다.
예시: 부서별 평균 급여가 50,000 이상인 부서만 조회
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
- 설명: HAVING 절은 그룹 함수가 적용된 후 그 결과에 대해 조건을 설정할 수 있습니다. 이 쿼리는 부서별 평균 급여가 50,000 이상인 부서만 조회합니다.
3. GROUP BY 절 관련 특수사항
1) GROUP BY 절에 포함되는 컬럼
GROUP BY 절에는 집계되지 않는 모든 컬럼이 포함되어야 합니다. 예를 들어, department_id별로 급여의 합계를 구하려면, SELECT 절에 있는 department_id는 반드시 GROUP BY 절에도 포함되어야 합니다.
예시: 부서별 급여 합계
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id;
- 설명: department_id는 GROUP BY 절에 포함되어야 하며, 이를 기준으로 급여 합계를 구합니다.
2) 여러 컬럼을 기준으로 그룹화
GROUP BY 절에서는 여러 컬럼을 동시에 기준으로 그룹을 만들 수 있습니다. 예를 들어, 부서와 직책을 기준으로 그룹화하려면, GROUP BY 절에 두 개의 컬럼을 모두 포함해야 합니다.
예시: 부서와 직책별 급여 합계
SELECT department_id, job_title, SUM(salary)
FROM employees
GROUP BY department_id, job_title;
- 설명: department_id와 job_title을 기준으로 그룹을 만들고, 그 그룹 내에서 급여의 합계를 구합니다.
3) GROUP BY에서 NULL 값 처리
GROUP BY 절은 NULL 값을 하나의 그룹으로 묶습니다. 즉, NULL 값이 있는 컬럼에 대해 GROUP BY를 적용하면, NULL 값을 하나의 그룹으로 취급하여 집계합니다.
예시: NULL 값을 포함한 그룹화
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
- 설명: department_id에 NULL 값이 포함되어 있으면, NULL 값은 하나의 그룹으로 묶여 집계됩니다.
4. 그룹 함수와 DISTINCT 사용
DISTINCT와 그룹 함수는 조합해서 사용할 수 있습니다. DISTINCT는 중복된 값을 제거한 후 그룹 함수를 적용합니다.
예시: 중복된 급여를 제외하고 평균 급여 계산
SELECT department_id, AVG(DISTINCT salary)
FROM employees
GROUP BY department_id;
- 설명: DISTINCT를 사용하면, 중복된 급여를 제외하고 평균 급여를 계산합니다.
정리
- 그룹 함수는 여러 행을 집계하여 하나의 값으로 요약하는 함수입니다.
- 주요 그룹 함수: COUNT(), SUM(), AVG(), MAX(), MIN()
- GROUP BY 절은 데이터를 그룹화하여 집계를 적용하는 데 사용됩니다.
- WHERE 절에서는 그룹 함수를 사용할 수 없고, HAVING 절에서 그룹 함수를 사용하여 그룹화된 데이터에 조건을 설정할 수 있습니다.
- GROUP BY 절에 사용된 컬럼은 SELECT 절에서도 반드시 사용해야 합니다.
- DISTINCT와 그룹 함수를 함께 사용할 수 있으며, 이는 중복 값을 제외하고 집계할 때 유용합니다.
'SQL' 카테고리의 다른 글
DECODE 함수란? (0) | 2025.02.05 |
---|---|
DELETE와 TRUNCATE 차이 (0) | 2025.01.24 |
JOIN에 대하여 OLD AND NEW (0) | 2025.01.23 |
%와 _ (0) | 2025.01.23 |
GROUP BY에서 조건은 HAVING에 쓴다 (0) | 2025.01.23 |