MySQL에서는 NULL과 빈 문자열('')이 서로 다른 값으로 취급됩니다. 따라서 데이터 검증 작업 시 두 경우를 각각 집계해야 하는 경우가 많습니다. 이 글에서는 CASE 문과 UNION ALL을 활용하여 테이블 내 NULL 값과 빈 문자열의 개수를 한 번에 확인하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable781 ( Name varchar(100) ); Query OK, 0 rows affected (0.66 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용하여 빈 문자열('')과 NULL 값을 섞어 레코드를 입력합니다. 총 7개의 행 중 빈 문자열 3개, NULL 3개, 그리고 정상적인 값 1개를 넣어 두 가지 경우를 모두 테스트할 수 있도록 구성했습니다.
mysql> insert into DemoTable781 values('');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable781 values('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable781 values('');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable781 values(null);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable781 values(null);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable781 values('');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable781 values(null);
Query OK, 1 row affected (0.28 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 봅니다.
mysql> select *from DemoTable781;
실행 결과는 다음과 같습니다.
+-------+ | Name | +-------+ | | | Chris | | | | NULL | | NULL | | | | NULL | +-------+ 7 rows in set (0.00 sec)
4. NULL 및 빈 문자열 개수를 구하는 쿼리
다음은 테이블에서 NULL 값과 빈 문자열의 개수를 각각 집계하는 쿼리입니다.
mysql> (select SUM(CASE when Name IS NULL THEN 1 ELSE 0 END) AS NullCountAndEmptyCount from DemoTable781) UNION ALL (select SUM(CASE when Name='' THEN 1 ELSE 0 END) AS NullCountAndEmptyCount from DemoTable781);
실행 결과는 다음과 같습니다.
+------------------------+ | NullCountAndEmptyCount | +------------------------+ | 3 | | 3 | +------------------------+ 2 rows in set (0.00 sec)
결과를 보면 첫 번째 행에는 NULL 값 3개, 두 번째 행에는 빈 문자열 3개가 집계된 것을 확인할 수 있습니다.
쿼리 동작 원리
SUM(CASE WHEN Name IS NULL THEN 1 ELSE 0 END)— 각 행을 검사하여 값이 NULL이면 1, 아니면 0을 반환하고, SUM으로 이를 모두 더해 NULL 개수를 계산합니다.SUM(CASE WHEN Name = '' THEN 1 ELSE 0 END)— 같은 방식으로 빈 문자열인 행만 골라 개수를 집계합니다.UNION ALL— 두 SELECT 문의 결과를 각각 별도의 행으로 합쳐 하나의 결과셋으로 출력합니다. 중복 제거가 필요 없으므로 UNION 대신 UNION ALL을 사용하면 성능상 유리합니다.
마무리
NULL과 빈 문자열은 겉보기에 비슷하지만 MySQL에서는 완전히 다른 값입니다. 위와 같이 CASE 문과 SUM 함수를 조합하면 특정 조건을 만족하는 행의 개수를 손쉽게 집계할 수 있으며, 데이터 품질 점검이나 입력값 검증 로직을 만들 때 유용하게 활용할 수 있습니다.