MySQL에서 하나의 행(row)에 있는 여러 컬럼 값을 더해 합계를 구하고 싶다면 아래의 방법을 사용할 수 있습니다. 컬럼에 NULL 값이 있는지 없는지에 따라 사용해야 하는 문법이 달라집니다.
Case 1 – NULL 값이 없는 경우
컬럼에 NULL 값이 전혀 없다면 다음과 같이 각 컬럼을 단순히 더하면 됩니다.
SELECT yourColumnName1+yourColumnName2+yourColumnName3+.......+N AS anyVariableName FROM yourTableName;
Case 2 – NULL 값이 있는 경우
컬럼에 NULL 값이 포함되어 있다면 IFNULL() 함수를 사용하여 NULL을 0으로 바꾼 뒤 더해야 합니다. 그렇지 않으면 결과가 NULL로 반환됩니다.
SELECT IFNULL(yourColumnName1,0)+IFNULL(yourColumnName2,0)+IFNULL(yourColumnName3,0)+.............+N AS anyVariableName FROM yourTableName;
예제 테이블 생성
위 문법을 실제로 이해하기 위해 테이블을 먼저 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table SumValueOfSingleRow
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> FirstValue int,
-> SecondValue int,
-> ThirdValue int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.70 sec)데이터 삽입
insert 명령으로 몇 개의 레코드를 삽입합니다. 이때 의도적으로 NULL 값도 함께 넣어 두겠습니다.
mysql> insert into SumValueOfSingleRow(FirstValue,SecondValue,ThirdValue) values(1,0,1); Query OK, 1 row affected (0.11 sec) mysql> insert into SumValueOfSingleRow(FirstValue,SecondValue,ThirdValue) values(1,NULL,0); Query OK, 1 row affected (0.19 sec) mysql> insert into SumValueOfSingleRow(FirstValue,SecondValue,ThirdValue) values(NULL,NULL,NULL); Query OK, 1 row affected (0.09 sec)
저장된 데이터 확인
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from SumValueOfSingleRow;
실행 결과는 다음과 같습니다.
+----+------------+-------------+------------+ | Id | FirstValue | SecondValue | ThirdValue | +----+------------+-------------+------------+ | 1 | 1 | 0 | 1 | | 2 | 1 | NULL | 0 | | 3 | NULL | NULL | NULL | +----+------------+-------------+------------+ 3 rows in set (0.00 sec)
Case 1 실행 결과 – NULL 처리 실패
위 출력 결과를 보면 NULL 값이 포함된 행이 있습니다. 이 상태에서 Case 1 방식을 적용하면 올바른 결과를 얻을 수 없습니다. 직접 확인해 보겠습니다.
mysql> select FirstValue+SecondValue+ThirdValue as SingleRowSum from SumValueOfSingleRow;
실행 결과는 다음과 같습니다.
+--------------+ | SingleRowSum | +--------------+ | 2 | | NULL | | NULL | +--------------+ 3 rows in set (0.06 sec)
출력 결과를 보면 NULL 값이 포함된 행은 합계가 정상적으로 계산되지 않고 NULL로 반환된 것을 알 수 있습니다. 즉, Case 1 방식은 NULL 값을 처리하지 못합니다.
Case 2 실행 결과 – NULL 처리 성공
이번에는 IFNULL() 함수를 사용한 Case 2 방식으로 동일한 조회를 수행해 보겠습니다.
mysql> select ifnull(FirstValue,0)+ifnull(SecondValue,0)+ifnull(ThirdValue,0) as SingleRowSum from SumValueOfSingleRow;
실행 결과는 다음과 같습니다.
+--------------+ | SingleRowSum | +--------------+ | 2 | | 1 | | 0 | +--------------+ 3 rows in set (0.06 sec)
이처럼 IFNULL() 함수로 NULL을 0으로 치환하면 NULL이 포함된 행도 정상적으로 합계가 계산됩니다. 따라서 컬럼에 NULL 값이 들어갈 가능성이 있다면 반드시 Case 2 방식을 사용하는 것이 안전합니다.