SQL에서 SUM과 COUNT는 둘 다 집계 함수이지만, 서로 다른 목적을 가지고 있습니다.
그럼에도 어떤 걸 사용해야 될지 고민하는 케이스가 있습니다.
둘의 차이점을 간단히 알아보고
혼동될 수 있는 케이스를 간단한 예시와 함께 알아봅시다.
SUM과 COUNT의 차이점
•
SUM: 숫자 열의 합계를 계산.
•
COUNT: 행의 개수를 계산.
올바른 사용법
1.
SUM 함수 사용 시 주의점:
•
SUM 함수는 반드시 숫자 열을 대상으로 해야 합니다.
•
NULL 값은 자동으로 무시됩니다.
2.
COUNT 함수 사용 시 주의점:
•
COUNT(*)는 테이블의 모든 행을 셉니다.
•
COUNT(column_name)은 특정 열의 NULL이 아닌 값들만 셉니다.
•
COUNT(DISTINCT column_name)은 중복을 제거한 후 셉니다.
일단, 위의 내용을 요약 해보았을 때, COUNT,SUM의 차이점과 용도는 명확하다.
하지만, 실무에서는 쿼리에 복잡도에 따라 혼동되는 케이스가 있기 마련이다.
아래의 예시로 비교해보도록 하자
예제 테이블
•
visit_logs 테이블: 방문 기록을 저장하는 테이블, 각 행은 개별 방문자를 나타냅니다. 추가로, 방문 유형(visit_type) 필드를 포함하여 방문자가 신규 방문자(1)인지 기존 방문자(0)인지를 나타냅니다.
+----+------------+---------------------+------------+
| id | visitor_id | visit_time | visit_type |
+----+------------+---------------------+------------+
| 1 | 1 | 2024-06-01 09:00:00 | 1 |
| 2 | 2 | 2024-06-01 09:15:00 | 0 |
| 3 | 1 | 2024-06-01 10:00:00 | 1 |
| 4 | 3 | 2024-06-01 10:30:00 | 0 |
| 5 | 1 | 2024-06-01 11:00:00 | 1 |
| 6 | 4 | 2024-06-01 12:00:00 | 0 |
| 7 | 2 | 2024-06-01 12:30:00 | 0 |
+----+------------+---------------------+------------+
YAML
복사
문제 상황
특정 시간대의 신규 방문자의 수를 계산해야 합니다. 이때 SUM과 COUNT를 사용하는 방법을 비교합니다.
실행 쿼리문 : 오전 신규방문자수 집계
SELECT
'Morning' AS time_period,
SUM(IF(visit_type = 1, 1, 0)) AS sum_new_visitor_count,
COUNT(IF(visit_type = 1, 1, NULL)) AS count_new_visitor_count
FROM
visit_logs
WHERE
visit_time BETWEEN '2024-06-01 09:00:00' AND '2024-06-01 11:59:59'
SQL
복사
결과
+------------+---------------------+----------------------+
| time_period| sum_new_visitor_count| count_new_visitor_count|
+------------+---------------------+----------------------+
| Morning | 3 | 3 |
+------------+---------------------+----------------------+
Diff
복사
위의 쿼리문은 SUM, COUNT 둘다 동일한 결과를 가질 수 있다.
여기서 어떤 쿼리문을 사용해야 올바른 방법일까 ?
두 방법 중 어떤 것이 선호되는지는 팀의 코딩 스타일이나 쿼리의 복잡성에 따라 다를 수 있지만,
둘 다 SQL 표준에 맞고 효율적으로 작동한다.
개인적 의견
위의 예시에서 굳이 실무 경험으로 개인적 의견을 말해보자면
COUNT 의 1은 참을 뜻하고, SUM 에서는 숫자1일 뜻하므로
조건문에 대해 SUM 이 가독성이 더 좋다고 생각된다.
나중에 쿼리문을 잊어버린 상태로 다시 봤을 때나,
다른 팀원들이 수정을 위해 보게 되었을 때
가독성은 중요한 작용을 한다고 생각됩니다.
다만, 중복 값 제거 후 집계를 낼 때는 COUNT 가 더 좋다고 생각하는 편이다.
(어디까지나 개인적 의견이므로 참고만 해주세요.)