본문 바로가기
프로그램 관련/SQL

[SQL] Null값의 구분과 Aggregation 함수

by RuBP 2023. 4. 3.
반응형
반응형

이번에는 SQL에서 데이터를 처리하는 과정에서 존재하는 값(혹은 상태) 중 하나인 NULL의 간단한 정의와

이를 구분하는 구문, 그리고 집계(Aggregation) 함수에서 처리 결과를 간단하게 정리하려 한다.

간단한 내용이지만 한번씩 헷갈리기 쉬운 내용이라 정리 차원에서 글을 작성하였다.


먼저 Null이 무엇인지 간단하게 알아보고 넘어가도록 하자.

단순히 영어 사전에서 찾아보면 이런 말로 내용이 표현되곤 한다.

  • adjective(형용사)
    • having no legal or binding force; invalid.
    • having or associated with the value zero.
  • noun(명사)
    • a zero

편의상 동사 등의 기타 정의도 있으나 여기선 생략했다.

말은 저렇게 적혀져 있지만, 간단하게 요약하면, 0과 같은 값이지만, 없는 값이라 보면 된다.

 

우리가 수학적인 개념으로는 0이 없는 값이라고 통상적으로 칭한다.

하지만, 컴퓨터에서는 0도 하나의 고유한 값으로 본다.

따라서, 0 외에 진짜 '데이터가 없는 것'을 표시하기 위한 별도의 값이 필요한데,

이게 바로 Null에 해당한다고 보면 된다.

참고로 말하지만 공백(='')이랑 Null이랑은 엄연히 다른 값임을 알도록 하자.


이러한 Null값을 SQL 구문에서 별도로 구분해야 하는 상황이 종종 발생한다.

따라서, 우선 단순히 Null 값을 구분하는 과정을 먼저 알아보도록 하자.

 

테이블 생성.

먼저, Null이 있는 데이터를 생성하기 위해서 위와 같은 ACCOUNT 테이블을 만들었다.

ID와 NAME 열의 경우 Not Null (NN)을 줘서 Null값이 못 들어가게 막았지만,

AGE와 ADDR에는 Null값이 자유롭게 들어갈 수 있는 상태이다.

 

샘플 데이터.

이제 다음과 같이 총 5개의 샘플 데이터가 있다고 하자.

맨 처음 데이터와 마지막 데이터는 모든 값이 다 존재하지만,

그 외의 데이터는 일부 값이 Null로 비어있는 것을 확인할 수 있다.

 

여기서 특정 Column은 Null값이고, 특정 Column은 Null값이 아닌 데이터를 추출해야 하는 경우가 있다.

이를 위해 사용할 수 있는 구문이 바로 IS NULLIS NOT NULL이다.

형식은 아래와 같다.

SELECT COL1, COL2, ...
FROM TABLE_NAME
WHERE COL1 IS NULL  -- COL1이 NULL값인 데이터
AND COL2 IS NOT NULL  -- 그리고 COL2는 NULL값이 아닌 데이터
...

여기서 필요에 따라서 IS NULL과 IS NOT NULL을 섞어서 사용하면 된다.

IS NULL은 특정 열의 데이터가 NULL 값인 것만 뽑아내는 구문이며,

반대로 IS NOT NULL은 특정 열의 데이터가 NULL이 아닌 값인 것만 추출하는 코드이다.

 

아래 예시 코드와 결과를 토대로 비교하면 금방 이해될 것이다.

 

IS NULL과 IS NOT NULL의 사용

위 구문에서 보면, AGE가 NULL값이고 ADDR는 NULL값이 아닌 데이터만 추출하도록 코드가 짜져있다.

앞선 원본 데이터를 기준으로 하나씩 체크해보도록 하자.

먼저, AGE IS NULL에 해당하는 데이터는 id가 sampe01인 것과 sql05인 것에 해당한다.

여기서, 추가로 ADDR가 NOT NULL인 데이터는 sql05밖에 없다.

따라서 위와 같이 sql05의 데이터만 추출되는 것을 확인할 수 있다.


이번엔 NULL값이 존재할 때 집계함수를 쓰면 어떤 결과가 나올지 간단하게 살펴보도록 하자.

집계함수라 하면 차후에 설명할 예정이므로 여기선 간략하게 소개만 하겠다.

흔히 우리가 자주 쓰는 MAX, MIN, SUM, COUNT, AVG 등에 해당한다 보면 된다.

 

SQL 상에서 NULL값과 비교 및 연산을 수행하게 된다면 NULL이라는 결과가 나온다.

가령, NULL + 2 => NULL, (NULL < 7) => NULL 등... 이라 보면 된다.

따라서, NULL값을 비교해야하는 경우 위처럼 IS NULL이나 IS NOT NULL을 쓰게 된다.

그런데, 위와 같은 집계함수의 경우 NULL값을 어떻게 처리할까?

 

대표적으로 SUM과 COUNT에 관해 적용한 결과를 보면 아래와 같다.

 

NULL이 존재하는 상황에서 SUM과 COUNT

신기하게도 위 세 구문 모두 값이 나오는 것을 확인할 수 있다.

기본적으로 집계 함수는 NULL값을 배제하고 계산을 수행하게 된다.

따라서, 결과가 NULL이 아닌 특정 수치라는 값이 나오게 된다.

 

SUM(AGE)의 경우 NULL이 아닌 숫자값들을 모두 더했으니 22+28+33 = 83이 나오게 된다.

COUNT(ADDR)의 경우 NULL이 아닌 문자들의 개수를 모두 셌으니 3개(충주, 나주, 전주)가 나오게 된다.

그리고 COUNT(*)는 전체 몇 개 데이터가 있는지 세는 구문이므로 5개가 나오게 된다.

COUNT(*)은 애당초 전체 column 기준으로 판단하니, 중간에 NULL이 있어도 상관없이 counting된다.


지금까지 간단하게 Null의 개념과 Null값의 비교, 그리고 집계함수에서 Null의 처리 과정을 살펴봤다.

사실 NULL값을 처리하는 함수나 코드 구문들은 다양하게 존재한다.

다만, 여기서 전부 다 정리하기 힘들어서 일부 내용을 나눠서 여기다 기술하였다.

다음에 시간이 남으면 Null대신 다른 값으로 바꿔서 처리하는 방법 등의 내용을 적어보도록 하겠다.

댓글