SQLD: NULL 요약 정리

임동혁 Ldhbenecia·2024년 8월 19일
0

DataBase

목록 보기
12/14
post-thumbnail

SQLD 학습을 하며 NULL에 대해 헷갈리는 부분이 많아 한 곳에 기록합니다.

NULL

  • NULL은 공백 문자 혹은 숫자 0과 동일하지 않는다.
  • 모르는 값(정해지지 않은 값)을 의미한다.
  • NULL과의 모든 비교(IS NULL 제외)는 알 수 없음을 반환한다.
  • NULL 값과 어떤 숫자를 비교한 결과는 항상 알 수 없음(Unknown)이다.
  • "NULL = NULL" 연산의 결과는 FALSE 또는 Unknown이다.
  • 집계 함수를 계산할 때 NULL의 값은 0이 아니라 계산에서 제외된다.

ANSI, ORACLE

  • ANSI 표준 기준 NULL을 찾아내는 경우는 IS NULL, IS NOT NULL이다.

  • ORACLE INSERT INTO 서비스 VALUES('999', '', '2015-11-11');를 입력했을 경우 서비스명 칼럼에 공백이 아닌 NULL이 입력된다.

    • ORACLE에서는 위의 데이터를 조회하려면 IS NULL 조건을 걸어줘서 조회해야한다.
      WHERE 서비스명 = '';으로 조회 불가능, IS NULL 사용
      SQL Server에서는 위위의 데이터를 조회하려면 IS NULL로 해도 조회되지 않는다.
      WHERE 서비스명 = '';로 조회 가능, '' 불가능
  • ORACLE NULL최대값으로 취급

  • SQL Server에서는 NULL최소값으로 취급

  • SQL Server는 NULL 값을 인덱스 맨 앞에 저장하고, Oracle은 맨 뒤에 저장한다.

함수

  • NULLIF(표현식1, 표현식2)
    표현식 1과 2가 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.

  • NVL/ISNULL(표현식1, 표현식2)
    표현식1 NULL이면 표현식2를 리턴한다.

  • NVL(표현식1, 0)
    표현식1이 NULL이면 0으로 표시, NULL이 아니면 그대로 표현식1로 표시

  • NVL2("값", "지정값1", "지정값2") // NVL2("값", "NOT NULL", "NULL")
    함수는 NULL이 아닌 경우 지정값1을 출력하고, NULL인 경우 지정값2를 출력한다.

  • NULLIF('A', 'A') : NULL 반환
    NULLIF('A', 'B') : A 반환
    두 인자값이 같으면 NULL 반환, 다르면 첫번째 인자값 반환

  • COALESCE(콜럼1, 콜럼2, ...)
    적은 콜럼 중 NULL이 아닌 첫 값을 호출
    콜럼1이 'A', 콜럼2가 NULL이면 'A'
    콜럼1이 NULL, 콜럼2가 'B'면 'B'
    콜럼1이 'A', 콜럼2가 'B'면 'A'

연산

GROUP BY절은 NULL이 있을 경우 NULL 데이터도 집계에 포함한다.

COL1COL2COL3
100NULL100
NULL200400
0300NULL
SELECT SUM(COL2) + SUM(COL3) FROM TAB1;
SELECT SUM(COL2) + SUM(COL3) FROM TAB1 WHERE COL1 > 0;
SELECT SUM(COL2) + SUM(COL3) FROM TAB1 WHERE COL1 IS NOT NULL;
SELECT SUM(COL2) + SUM(COL3) FROM TAB1 WHERE COL1 IS NULL;

정답: 1000, NULL, 400, 600
두번째 SQL문에서 COL1이 0보다 큰 것에 대해서
100 NULL 100 레코드를 연산한다.
SUM(COL2)는 NULL을 리턴한다. SUM(COL3)은 100을 리턴한다.
NULL + 100 = NULL

NULL로만 구성된 컬럼을 COUNT하면 공집합이 아니라 0이 나온다.

SELECT SUM(column_name)
FROM table_name
WHERE condition;

SUM 함수는 NULL 값을 제외하고 합산을 수행하며, NULL 값만 있는 경우에도 0을 반환한다.

profile
지극히 평범한 공대생

0개의 댓글

Powered by GraphCDN, the GraphQL CDN