MySQL SUM() 함수와 NULL 반환의 원리
MySQL에서 SUM() 함수를 일치하는 행이 하나도 없는 SELECT 문과 함께 사용하면, 평가할 값 자체가 존재하지 않기 때문에 결과로 NULL을 반환합니다.
많은 개발자들이 이 경우 0이 반환될 것이라고 기대하기 쉽습니다. 하지만 0 역시 하나의 숫자 값입니다. 일치하는 행이 전혀 없는 상황에서 의미 있는 숫자를 반환하는 것은 적절하지 않으므로, MySQL은 값이 없다는 뜻으로 NULL을 반환하도록 설계되어 있습니다.
예제 테이블 확인
이 개념을 이해하기 위해 다음과 같은 레코드를 가진 employee_tbl 테이블을 살펴보겠습니다.
mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+--------------------+ | 1 | John | 2007-01-24 | 250 | | 2 | Ram | 2007-05-27 | 220 | | 3 | Jack | 2007-05-06 | 170 | | 3 | Jack | 2007-04-06 | 100 | | 4 | Jill | 2007-04-06 | 220 | | 5 | Zara | 2007-06-06 | 300 | | 5 | Zara | 2007-02-06 | 350 | +------+------+------------+--------------------+ 7 rows in set (0.00 sec)
일치하는 행이 없는 경우의 SUM() 결과
이제 'Name' 컬럼에 존재하지 않는 이름인 'Mohan'이 입력한 총 페이지 수를 구하는 아래 쿼리를 실행해 보겠습니다.
mysql> SELECT SUM(daily_typing_pages) FROM employee_tbl WHERE Name = 'Mohan'; +-------------------------+ | SUM(daily_typing_pages) | +-------------------------+ | NULL | +-------------------------+ 1 row in set (0.00 sec)
'Mohan'이라는 이름을 가진 행이 테이블에 존재하지 않기 때문에, SUM() 함수는 합산할 값이 없음을 나타내는 NULL을 반환합니다.
NULL 대신 0을 얻고 싶다면?
실무에서는 NULL 대신 0을 받고 싶은 경우가 많습니다. 이럴 때는 COALESCE() 또는 IFNULL() 함수를 활용하면 됩니다.
mysql> SELECT COALESCE(SUM(daily_typing_pages), 0) FROM employee_tbl WHERE Name = 'Mohan'; +--------------------------------------+ | COALESCE(SUM(daily_typing_pages), 0) | +--------------------------------------+ | 0 | +--------------------------------------+ 1 row in set (0.00 sec)
이처럼 SUM() 함수의 결과가 NULL일 때 기본값을 지정해 주면, 애플리케이션 로직에서 NULL 처리를 따로 하지 않아도 되어 코드가 더 간결해집니다.