시험 평균 점수나, 예를 들어 부서의 평균 연봉을 계산해본 적 있다면 이미 산술 평균 개념은 익숙할 거야. 사실 이건 학교에서도 엄청 자주 배우지. SQL에서는 데이터셋에서 평균값을 구하는 모든 작업을 AVG() 함수로 해결해!
AVG() 함수는 숫자 컬럼의 산술 평균을 계산하는 집계 함수야. 지정한 컬럼의 모든 값을 더하고, 그 값을 값의 개수로 나눠. NULL은 신경 안 써 (이게 오히려 편한데, 이건 좀 있다가 얘기할게).
AVG() 문법
일단 기본 문법부터 보자:
SELECT AVG(컬럼)
FROM 테이블;
여기서 컬럼은 평균을 구하고 싶은 숫자 값이 들어있는 컬럼이야.
예시 1: 직원들 평균 연봉
예를 들어 employees 테이블에 직원 정보랑 연봉이 저장돼 있다고 해보자:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
평균 연봉을 구하는 간단한 쿼리:
SELECT AVG(salary) AS average_salary
FROM employees;
결과:
| average_salary |
|---|
| 54250 |
어떻게 동작하냐면?
AVG()가 모든 연봉을 더해: 50000 + 60000 + 55000 + 52000 = 217000.- 그리고 NULL이 아닌 값의 개수로 나눠: 217000 / 4 = 54250.
AVG()와 NULL의 특징
평균 연봉을 구할 때 salary 컬럼의 NULL 값은 무시된 걸 눈치챘을 거야. 이게 AVG()의 핵심 특징이야. NULL이 아닌 값만 계산에 포함돼.
예시를 보자:
SELECT AVG(NULL) AS result;
결과:
| result |
|---|
| NULL |
이걸로 AVG()가 NULL을 무시한다는 걸 다시 확인할 수 있어. 근데 만약 데이터셋 전체가 NULL이면 결과도 NULL이야.
근데 만약 테이블에 NULL이 아니라 0이 들어가 있으면, 그 값은 무시되지 않아.
employees 테이블
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
SQL 쿼리:
SELECT AVG(salary) AS avg_salary
FROM employees;
결과:
| avg_salary |
|---|
| 1000 |
왜 이렇게 되냐면?
AVG()가 이렇게 계산해:
[(1000 + 0 + 2000) / 3 = 1000]
NULL이 있는 행은 평균 계산에서 무시돼.
예시: 학생들 평균 나이 계산
이번엔 students 테이블을 보자:
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
쿼리:
SELECT AVG(age) AS average_age
FROM students;
결과:
| average_age |
|---|
| 21 |
AVG()는 Maria 학생을 무시해, 왜냐면 나이가 NULL이니까.- 평균은 이렇게 계산돼: (20 + 22 + 21) / 3 = 21.
결과 반올림하기
가끔 AVG() 결과가 소수점 아래 여러 자리로 나올 때가 있어.
반올림된 숫자가 필요하면 ROUND() 함수를 쓰면 돼.
employees 테이블
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
SQL 쿼리
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
결과
| rounded_average_salary |
|---|
| 52333.33 |
NULL이 있는 행은 계산에서 빠지니까, 평균은 세 개 값만으로 계산돼.
평균 계산 전에 데이터 필터링하기 AVG()
특정 조건에 맞는 값만 평균 내고 싶으면 WHERE을 써.
employees 테이블
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
예시: id > 2인 직원들 평균 연봉 구하기
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
결과
| average_salary |
|---|
| 53500 |
계산에는 id = 3이랑 id = 4 연봉만 들어가. NULL은 무시돼.
예시: AVG()로 복잡한 쿼리 만들기
AVG()를 다른 집계 함수나 연산자랑 조합해서 쓸 수도 있어.
예를 들어 sales라는 판매 테이블이 있다고 해보자:
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | 핸드폰 | 2 | 500 |
| 2 | 노트북 | 1 | 1500 |
| 3 | 태블릿 | 3 | 300 |
평균 총 판매 금액을 구하는 쿼리:
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
결과:
| averagetotalsale |
|---|
| 950 |
꿀팁과 흔한 실수들
AVG() 쓸 때는 이런 실수 조심해야 해:
NULL 값: 결과가 예상보다 작게 나와서 당황할 때가 있는데, AVG()는 NULL이 있는 행을 그냥 건너뛰니까 그래.
데이터 타입 섞임: 컬럼에 숫자랑 텍스트가 섞여 있으면 (이건 진짜 별로임), AVG()는 에러를 뱉어.
GO TO FULL VERSION