MySQL에서 레코드가 없을 때 합계 또는 0 반환하기
MySQL에서 조건에 맞는 레코드가 존재하면 합계를, 존재하지 않으면 0을 반환하고 싶다면 COALESCE() 함수 안에 집계 함수 SUM()을 사용하면 됩니다. SUM()은 일치하는 레코드가 없을 때 NULL을 반환하는데, COALESCE()는 인수 중 첫 번째로 NULL이 아닌 값을 반환하기 때문에 이 특성을 활용해 기본값으로 0을 지정할 수 있습니다.
기본 문법
SELECT COALESCE(SUM(yourColumnName2), 0) AS anyVariableName
FROM yourTableName
WHERE yourColumnName1 LIKE '%yourValue%';
예제 테이블 생성
문법을 실제로 이해하기 위해 테이블을 하나 만들어 보겠습니다. 아래 쿼리로 SumDemo 테이블을 생성합니다.
mysql> CREATE TABLE SumDemo
-> (
-> Words VARCHAR(100),
-> Counter INT
-> );
Query OK, 0 rows affected (0.93 sec)
샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> INSERT INTO SumDemo VALUES('Are You There',10);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO SumDemo VALUES('Are You Not There',15);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO SumDemo VALUES('Hello This is MySQL',12);
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO SumDemo VALUES('Hello This is not MySQL',14);
Query OK, 1 row affected (0.24 sec)전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> SELECT * FROM SumDemo;
실행 결과는 다음과 같습니다.
+-------------------------+---------+
| Words | Counter |
+-------------------------+---------+
| Are You There | 10 |
| Are You Not There | 15 |
| Hello This is MySQL | 12 |
| Hello This is not MySQL | 14 |
+-------------------------+---------+
4 rows in set (0.00 sec)
레코드가 존재할 경우: 합계 반환
조건에 맞는 레코드가 존재하면 해당 값들의 총합이 반환됩니다. 'hello'라는 단어가 포함된 행의 Counter 합계를 구하는 쿼리입니다.
mysql> SELECT COALESCE(SUM(Counter), 0) AS SumOfAll FROM SumDemo WHERE Words LIKE '%hello%';
실행 결과:
+----------+
| SumOfAll |
+----------+
| 26 |
+----------+
1 row in set (0.00 sec)
'Hello This is MySQL'(12)과 'Hello This is not MySQL'(14) 두 레코드의 합계인 26이 정상적으로 반환되었습니다.
레코드가 존재하지 않을 경우: 0 반환
반대로 조건에 맞는 레코드가 하나도 없으면 SUM()은 NULL을 반환하지만, COALESCE() 덕분에 0이 출력됩니다.
mysql> SELECT COALESCE(SUM(Counter), 0) AS SumOfAll FROM SumDemo WHERE Words LIKE '%End of MySQL%';
실행 결과:
+----------+
| SumOfAll |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
정리
COALESCE(SUM(컬럼명), 0) 패턴을 사용하면 일치하는 레코드가 있을 때는 합계를, 없을 때는 NULL 대신 0을 깔끔하게 받아낼 수 있습니다. 애플리케이션 코드에서 NULL 처리 로직을 별도로 작성할 필요가 없어지므로, 통계나 카운트 기능을 구현할 때 매우 유용한 방법입니다.