집계 함수(Aggregate Functions)는 여러 행의 데이터를 그룹으로 묶어 하나의 결과값으로 계산하는 함수입니다. SQLD 시험에서는 각 함수의 정확한 동작 방식과 NULL 값 처리, 그리고 GROUP BY, HAVING 절과의 조합에 대한 문제가 자주 출제됩니다.
| 함수 | 개념 | NULL 값 처리 | DISTINCT 사용 |
|---|---|---|---|
SUM | 합계 | 제외 | 가능 (중복 제거 후 합계) |
AVG | 평균 | 제외 | 가능 (중복 제거 후 평균) |
COUNT | 개수 | *: 포함, 컬럼: 제외 | 가능 (중복 + NULL 제외) |
MAX | 최댓값 | 제외 | 불가 |
MIN | 최솟값 | 제외 | 불가 |
NULL 값 처리 (★★★★★)SUM, AVG, MAX, MIN, COUNT(컬럼)은 NULL 값을 계산에서 제외합니다.COUNT(*)는 NULL 값을 포함하여 모든 행의 개수를 셉니다.AVG(salary)와 AVG(NVL(salary, 0))의 결과가 달라지는 이유는 NULL이 포함되느냐에 따라 평균을 구하는 **모수(전체 개수)**가 달라지기 때문입니다.COUNT 함수 종류별 차이 (★★★★★)COUNT(*): 테이블의 모든 행 수를 반환.COUNT(컬럼): 해당 컬럼에 NULL이 아닌 값의 개수만 반환.COUNT(DISTINCT 컬럼): 중복을 제거하고 NULL을 제외한 고유값의 개수를 반환.WHERE 절에서는 집계 함수를 사용할 수 없습니다.SELECT dept_id FROM Employees WHERE COUNT(*) > 10; ❌GROUP BY 절을 통해 그룹별로 집계하고, HAVING 절에서 집계 결과에 대한 조건을 지정합니다.SELECT dept_id FROM Employees GROUP BY dept_id HAVING COUNT(*) > 10; ✅SUM / AVG: NULL은 무시하고, 만약 모든 값이 NULL이면 결과도 NULL!COUNT: *****는 ALL (전체), **컬럼**은 NULL 빼고, **DISTINCT**는 **중복**도 빼고!WHERE가 아니라 HAVING!다음 Employees 테이블이 있다.
| emp_id | dept_id | salary | bonus |
| :--- | :--- | :--- | :--- |
| 1 | 10 | 3000 | 500 |
| 2 | 10 | 4000 | NULL |
| 3 | 20 | 5000 | 300 |
| 4 | 20 | NULL | NULL |
SELECT AVG(salary), AVG(bonus), COUNT(salary), COUNT(bonus), COUNT(*)
FROM Employees;
👉 결과는?
다음 SQL의 실행 결과를 예측하시오.
(위 테이블 사용)
SELECT dept_id, AVG(salary)
FROM Employees
GROUP BY dept_id;
👉 결과는?
다음 설명 중 옳은 것을 모두 고른 것은?
ㄱ. MAX 함수는 문자열 컬럼에 사용할 수 없다.
ㄴ. COUNT(컬럼명)은 NULL 값을 포함하여 행의 개수를 센다.
ㄷ. SUM 함수는 모든 값이 NULL일 경우 결과가 NULL이다.
ㄹ. HAVING 절은 WHERE 절과 동일한 기능을 수행한다.
A. ㄱ, ㄴ
B. ㄷ
C. ㄱ, ㄷ
D. ㄴ, ㄹ
다음 중 COUNT(*)와 동일한 결과를 반환하지 않는 것은?
A. COUNT(1)
B. COUNT(0)
C. COUNT('abc')
D. COUNT(NULL)
문제 1 정답:
AVG(salary): (3000 + 4000 + 5000) / 3 = 4000AVG(bonus): (500 + 300) / 2 = 400COUNT(salary): 3 (NULL 제외)COUNT(bonus): 2 (NULL 제외)COUNT(*): 4 (전체 행)문제 2 정답:
dept_id=10 그룹: AVG(salary) = (3000+4000)/2 = 3500dept_id=20 그룹: AVG(salary) = (5000)/1 = 500010, 3500 / 20, 5000문제 3 정답: B
MAX는 문자열 컬럼에도 사용 가능합니다. ㄴ. COUNT(컬럼명)은 NULL을 제외합니다. ㄹ. HAVING은 GROUP BY의 결과에 대한 조건을 지정합니다. WHERE와는 다릅니다.문제 4 정답: D
COUNT(NULL)은 NULL이 값이 아니므로 항상 0을 반환합니다. 나머지는 모두 NULL이 될 수 없는 유효한 상수이므로 COUNT(*)와 동일한 결과를 반환합니다.