집계 함수 정리

TJK·2025년 8월 22일

집계 함수 정리

집계 함수(Aggregate Functions)는 여러 행의 데이터를 그룹으로 묶어 하나의 결과값으로 계산하는 함수입니다. SQLD 시험에서는 각 함수의 정확한 동작 방식과 NULL 값 처리, 그리고 GROUP BY, HAVING 절과의 조합에 대한 문제가 자주 출제됩니다.


1. 집계 함수 개념

함수개념NULL 값 처리DISTINCT 사용
SUM합계제외가능 (중복 제거 후 합계)
AVG평균제외가능 (중복 제거 후 평균)
COUNT개수*: 포함, 컬럼: 제외가능 (중복 + NULL 제외)
MAX최댓값제외불가
MIN최솟값제외불가

2. 시험 핵심 포인트

1. NULL 값 처리 (★★★★★)

  • SUM, AVG, MAX, MIN, COUNT(컬럼)NULL 값을 계산에서 제외합니다.
  • COUNT(*)NULL 값을 포함하여 모든 행의 개수를 셉니다.
  • 시험 함정: AVG(salary)AVG(NVL(salary, 0))의 결과가 달라지는 이유는 NULL이 포함되느냐에 따라 평균을 구하는 **모수(전체 개수)**가 달라지기 때문입니다.

2. COUNT 함수 종류별 차이 (★★★★★)

  • COUNT(*): 테이블의 모든 행 수를 반환.
  • COUNT(컬럼): 해당 컬럼에 NULL이 아닌 값의 개수만 반환.
  • COUNT(DISTINCT 컬럼): 중복을 제거하고 NULL을 제외한 고유값의 개수를 반환.

3. 집계 함수 사용 위치

  • WHERE 절에서는 집계 함수를 사용할 수 없습니다.
    • SELECT dept_id FROM Employees WHERE COUNT(*) > 10;
  • GROUP BY 절을 통해 그룹별로 집계하고, HAVING 절에서 집계 결과에 대한 조건을 지정합니다.
    • SELECT dept_id FROM Employees GROUP BY dept_id HAVING COUNT(*) > 10;

4. MAX / MIN

  • 숫자, 날짜, 문자열 등 모든 데이터 타입에 적용 가능합니다.
  • 문자열의 경우 사전순으로 비교합니다.
  • 날짜의 경우 최근 날짜(MAX), **오래된 날짜(MIN)**를 찾습니다.

3. 암기 팁

  • SUM / AVG: NULL은 무시하고, 만약 모든 값이 NULL이면 결과도 NULL!
  • COUNT: *****는 ALL (전체), **컬럼**은 NULL 빼고, **DISTINCT**는 **중복**도 빼고!
  • 집계 결과 조건: WHERE가 아니라 HAVING!

실전 기출 문제 세트

문제 1

다음 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;

👉 결과는?


문제 2

다음 SQL의 실행 결과를 예측하시오.
(위 테이블 사용)

SELECT dept_id, AVG(salary)
FROM Employees
GROUP BY dept_id;

👉 결과는?


문제 3

다음 설명 중 옳은 것을 모두 고른 것은?
ㄱ. MAX 함수는 문자열 컬럼에 사용할 수 없다.
ㄴ. COUNT(컬럼명)NULL 값을 포함하여 행의 개수를 센다.
ㄷ. SUM 함수는 모든 값이 NULL일 경우 결과가 NULL이다.
ㄹ. HAVING 절은 WHERE 절과 동일한 기능을 수행한다.

A. ㄱ, ㄴ
B. ㄷ
C. ㄱ, ㄷ
D. ㄴ, ㄹ


문제 4 (함정 문제)

다음 중 COUNT(*)와 동일한 결과를 반환하지 않는 것은?
A. COUNT(1)
B. COUNT(0)
C. COUNT('abc')
D. COUNT(NULL)


정답 및 해설

  • 문제 1 정답:

    • AVG(salary): (3000 + 4000 + 5000) / 3 = 4000
    • AVG(bonus): (500 + 300) / 2 = 400
    • COUNT(salary): 3 (NULL 제외)
    • COUNT(bonus): 2 (NULL 제외)
    • COUNT(*): 4 (전체 행)
  • 문제 2 정답:

    • dept_id=10 그룹: AVG(salary) = (3000+4000)/2 = 3500
    • dept_id=20 그룹: AVG(salary) = (5000)/1 = 5000
    • 결과: 10, 3500 / 20, 5000
  • 문제 3 정답: B

    • 해설: ㄱ. MAX는 문자열 컬럼에도 사용 가능합니다. ㄴ. COUNT(컬럼명)NULL을 제외합니다. ㄹ. HAVINGGROUP BY의 결과에 대한 조건을 지정합니다. WHERE와는 다릅니다.
  • 문제 4 정답: D

    • 해설: COUNT(NULL)NULL이 값이 아니므로 항상 0을 반환합니다. 나머지는 모두 NULL이 될 수 없는 유효한 상수이므로 COUNT(*)와 동일한 결과를 반환합니다.
profile
Hello world!

0개의 댓글