상상해봐... 너한테 마트에서 산 물건 리스트가 엄청 길게 있어. 결국 얼마 썼는지 합계를 내고 싶지? 근데 그걸 손으로 다 더할 순 없잖아? 근데 판매자들은 이미 다 데이터베이스에 저장해놨어. 그래서 너는 딱 맞는 금액이 찍힌 영수증을 받는 거지. 아마 그들의 앱 어딘가에서 오늘의 주인공 SUM() 함수가 도와주고 있을 거야! 이건 숫자 타입 컬럼의 값을 다 더해주는 집계 함수야.
SUM() 문법
SUM() 함수는 이름처럼 진짜 간단하게 생겼어. 근데 하나씩 뜯어보자:
SELECT SUM(컬럼)
FROM 테이블;
이 함수는 지정한 컬럼의 모든 값을 다 더해줘. 근데 솔직히 말해서: 텍스트나 날짜를 마법처럼 더해주진 않아! 오직 숫자만 가능해.
SUM() 사용 예시
간단한 예시부터 시작해보자. salaries라는 테이블이 있는데, 여기엔 직원들 월급이 저장돼 있어:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 55000 |
| 4 | 75000 |
예시 1: 모든 월급 합치기
회사 전체 월급 총액이 궁금해? 이렇게 하면 돼:
SELECT SUM(salary) AS total_salary
FROM salaries;
결과:
| total_salary |
|---|
| 240000 |
여기서 무슨 일이 있었냐면? PostgreSQL이 salary 컬럼의 모든 값(50000 + 60000 + 55000 + 75000)을 더해서 total_salary라는 새 컬럼에 결과를 보여준 거야.
예시 2: 조건이 있는 합계
이번엔 월급이 55,000보다 많은 직원들만의 총 월급이 궁금하다면? 우리 모두 좋아하는 WHERE 연산자를 써보자:
SELECT SUM(salary) AS high_salary_total
FROM salaries
WHERE salary > 55000;
결과:
| high_salary_total |
|---|
| 135000 |
여기선 뭐가 일어난 거냐면? PostgreSQL이 먼저 WHERE salary > 55000 필터를 적용해서 월급이 60000, 75000인 행만 남겼어. 그리고 그 둘을 더한 거지 (60000 + 75000).
3. SUM() 쓸 때 주의할 점
NULL이 SUM()에 어떤 영향을 줄까? 이미 봤듯이, NULL은 "아무것도 아님"이고 SUM()은 그걸 계산에 포함시키지 않아. 테이블을 보자:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | NULL |
| 4 | 75000 |
이제 월급 총액을 구해보면:
SELECT SUM(salary) AS total_salary
FROM salaries;
결과:
| total_salary |
|---|
| 185000 |
왜 "185000"이고 "NULL"이 아니지? PostgreSQL은 NULL을 그냥 무시하고 합계를 계산해.
SUM()로 복잡한 쿼리 예시
예시 1: 합계랑 필터링을 한 번에
sales라는 테이블이 있다고 해보자. 여기엔 판매 데이터가 들어있어. 구조는 이래:
| product_id | amount |
|---|---|
| 1 | 150 |
| 2 | 200 |
| 3 | NULL |
| 1 | 100 |
첫 번째 상품(product_id = 1)만의 판매 합계를 알고 싶으면 이렇게 해:
SELECT SUM(amount) AS total_sales
FROM sales
WHERE product_id = 1;
결과:
| total_sales |
|---|
| 150 |
예시 2: 합계랑 추가 계산
다시 salaries 테이블로 돌아가서, 월급 총액이 200,000을 얼마나 넘는지 알고 싶으면:
SELECT SUM(salary) - 200000 AS surplus
FROM salaries;
결과:
| surplus |
|---|
| 40000 |
SUM() 쓸 때 자주 하는 실수
숫자가 아닌 데이터에 SUM() 쓰기: 실수로 텍스트 같은 걸 합치려고 하면 에러가 나. 컬럼의 데이터 타입을 꼭 확인해!
NULL 무시하기: 초보자들은 NULL도 계산에 들어간다고 착각하는데, 그럼 예상치 못한 결과가 나올 수 있어.
GO TO FULL VERSION