빈 테이블에서 MAX() 함수의 NULL 결과를 피하는 방법
MySQL에서 테이블이 비어 있거나 컬럼 값이 모두 NULL일 때 MAX() 같은 집계 함수를 사용하면 결과로 NULL이 반환됩니다. 이러한 NULL 결과를 원하지 않는 값(예: 0)으로 대체하려면 COALESCE() 함수를 집계 함수와 함께 사용하면 됩니다.
COALESCE()는 인자로 전달된 값들 중 첫 번째로 NULL이 아닌 값을 반환하는 함수입니다. 따라서 MAX()의 결과가 NULL이면 그 다음 인자인 기본값이 대신 반환됩니다.
기본 문법
SELECT COALESCE(MAX(`yourColumnName`), 0) FROM yourTableName;
위 문법을 실제로 이해하기 위해 예제 테이블을 만들어 보겠습니다.
1. 테이블 생성
mysql> create table avoidNullDemo
-> (
-> `rank` int
-> );
Query OK, 0 rows affected (0.53 sec)
2. 데이터 삽입
INSERT 명령을 사용해 일부 레코드를 삽입합니다. 일부러 NULL 값도 함께 넣었습니다.
mysql> insert into avoidNullDemo values(10);
Query OK, 1 row affected (0.20 sec)
mysql> insert into avoidNullDemo values(NULL);
Query OK, 1 row affected (0.18 sec)
mysql> insert into avoidNullDemo values(20);
Query OK, 1 row affected (0.17 sec)
mysql> insert into avoidNullDemo values(NULL);
Query OK, 1 row affected (0.11 sec)
mysql> insert into avoidNullDemo values(100);
Query OK, 1 row affected (0.11 sec)
mysql> insert into avoidNullDemo values(NULL);
Query OK, 1 row affected (0.16 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from avoidNullDemo;
NULL 값이 포함된 출력 결과는 다음과 같습니다.
+------+
| rank |
+------+
| 10 |
| NULL |
| 20 |
| NULL |
| 100 |
| NULL |
+------+
6 rows in set (0.00 sec)
4. COALESCE()를 사용한 NULL 방지 쿼리
이제 COALESCE()를 적용하여 NULL 결과를 피하는 쿼리를 실행해 보겠습니다.
mysql> select COALESCE(MAX(`rank`), 0) FROM avoidNullDemo;
출력 결과는 다음과 같습니다. 최대값인 100이 정상적으로 반환됩니다.
+--------------------------+
| COALESCE(MAX(`rank`), 0) |
+--------------------------+
| 100 |
+--------------------------+
1 row in set (0.00 sec)
5. 빈 테이블에서의 동작 확인
이번에는 테이블이 완전히 비어 있는 경우를 살펴보겠습니다. TRUNCATE 명령으로 테이블의 모든 레코드를 삭제합니다.
mysql> truncate table avoidNullDemo;
Query OK, 0 rows affected (0.92 sec)
이제 테이블이 비어 있습니다. 앞서 작성한 동일한 쿼리를 빈 테이블에 실행해 보겠습니다.
mysql> select COALESCE(MAX(`rank`), 0) FROM avoidNullDemo;
출력 결과는 다음과 같습니다. 테이블이 비어 있어도 NULL이 아닌 0이 반환되는 것을 확인할 수 있습니다.
+--------------------------+
| COALESCE(MAX(`rank`), 0) |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (0.00 sec)
정리
빈 테이블에 대해 MAX() 같은 집계 함수를 사용하면 MySQL은 기본적으로 NULL을 반환합니다. 이때 COALESCE(MAX(컬럼명), 0) 형태로 작성하면 결과가 NULL일 경우 지정한 기본값(여기서는 0)으로 대체됩니다. IFNULL() 함수를 사용해도 동일한 효과를 얻을 수 있으며, 이 방식은 통계 조회나 리포트 작성 시 NULL 처리를 간편하게 해주는 유용한 패턴입니다.