SQLD 학습을 하며 NULL에 대해 헷갈리는 부분이 많아 한 곳에 기록합니다.
ANSI
표준 기준 NULL
을 찾아내는 경우는 IS NULL, IS NOT NULL
이다.
ORACLE
INSERT INTO 서비스 VALUES('999', '', '2015-11-11');를 입력했을 경우 서비스명 칼럼에 공백이 아닌 NULL
이 입력된다.
ORACLE
에서는 위의 데이터를 조회하려면 IS NULL 조건을 걸어줘서 조회해야한다.IS NULL
사용SQL Server
에서는 위위의 데이터를 조회하려면 IS NULL로 해도 조회되지 않는다.''
불가능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 데이터도 집계에 포함한다.
COL1 | COL2 | COL3 |
---|---|---|
100 | NULL | 100 |
NULL | 200 | 400 |
0 | 300 | NULL |
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을 반환한다.