안녕하세요. 이번 시간에는 데이터베이스에서 기본적으로 NULL이 무엇이며, NULL을 처리하는 함수에 대해 알아보겠습니다.
데이터베이스에서 NULL이란?
NULL 값은 아직 정의되지 않은 값!
NULL 은 0 또는 공백이 아니다! (0은 숫자이고, 공백은 하나의 문자이다.)
테이블을 생성할 때 NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을 포함할 수 있다.
NULL 값을 포함하는 연산의 경우 결과 값도 NULL 값이다.
+알아두기!
결과 값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL / ISNULL 함수를 사용한다. NULL 값의 대상이 숫자 유형 데이터인 경우는 주로 0 으로,
문자 데이터인 경우는 블랭크보단 'X' 같이 해당 시스템에서 의미 없는 문자로 바꾸는 경우가 많다.
NULL을 처리하는 함수
NULL 함수가 필요한 이유?
NULL 함수를 유용하게 사용하는 예는 산술적인 계산에서 데이터 값이 NULL인 경우이다. 즉 컬럼 간의 계산을 수행하는 경우 NULL 값이 존재하면 해당 연산 결과가 NULL 값이 되므로 원하는 결과를 얻을 수 없는 경우가 발생한다. 이런 경우는 NVL 함수를 사용하여 숫자인 0으로 변환을 시킨 후 계산을 해서 원하는 데이터 값을 얻게 하기 위함이다.
관계형 데이터베이스에서 NULL처리를 하는 주요 함수!
일반형 함수 |
함수 설명 |
NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2) |
표현식1의 결과값이 NULL이면 표현식2의 값을 출력 단, 표현식1과 표선식2의 결과 데이터 타입이 같아야 함! NULL 관련 가장 많이 사용되는 함수이므로 상당히 중요하다. |
NULLIF(표현식1,표현식2) |
표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 리턴 |
COALESCE(표현식1, 표현식2, .... 표현식N) |
임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 모든 표현식이 NULL이라면 NULL을 리턴한다. |
* ORACLE 함수 / SQL Server 함수 , / 없는 것은 공통 함수
NVL 함수
-----------------------------예제--------------------------------
1. SELECT NVL(NULL, 'NVL-OK') NVL_TEST
FROM DUAL;
결과테이블
NVL_TEST
-----------
NVL-OK
1개의 행이 선택되었다.
2. SELECT NVL('Not-Null', 'NVL-OK') NVL_TEST
FROM DAUL;
결과테이블
NVL_TEST
------------
Not-Null
1개의 행이 선택되었다.
*ISNULL도 마찬가지...
ex 01 ) 선수테이블에서 성남 일화천마(K08) 소속 선수의 이름과 포지션을 출력하는데, 포지션이 없는 경우는 '없음' 으로 표시한다.
SELECT PLAYER_NAME 선수명, POSITION, NVL(POSITION, '없음') 포지션
FROM PLAYER
WHERE TEAM_ID = 'K08'
ex 02 ) ex 01 문제를 NVL이 아닌 벤더 공통인 CASE 문으로 나타내어라.
SELECT PLAYER_NAME 선수명,
CASE WHEN POSITION IS NULL
THEN '없음'
ELSE POSITION
END AS 포지션
FROM PLAYER
WHERE TEAM_ID = 'K08'
보통 계산식이나 특정한 문구를 요구 하는 게 아니라면, NULL 표현을 9999라고 표현하기도 함
SELECT NVL(MGR,9999) MGR FROM EMP WHERE ENAME = 'KING';
결과테이블
MGR
---------
9999
SELECT 1 FROM DUAL WHERE 1 = 2; 같은 조건이 대표적인 공집합을 발생시키는 SQL문이다. 위와 같이 조건에 맞는 데이터가 한 건도 없는 경우를 공집합이라고 한다. NULL 데이터와는 또 다르게 이해해야 함!
공집합을 NULL로 처리하려는 오류!!
JSC라는 사원은 없다. 하지만 JSC라는 사원을 출력하려고한다. 당연히 한 건도 조회가 되지 않으니 0건이 조회되고 이 말은 즉 공집합을 나타낸다. 따라서 개발자는 무의식적으로 공집합을 NVL 함수로 처리하려고 한다.
SELECT NVL(MGR, 9999) MGR FROM EMP WHERE ENAME = 'JSC';
NVL함수로 공집합을 처리했지만, 결과는 공집합으로 나온다. 즉! 공집합을 NVL함수로 처리할 수 없다.
* 집계함수와 Scaler Subquery의 경우는 인수의 결과 값이 공집합인 경우에도 NULL을 출력할 수 있다.
NULLIF 함수
NULLIF함수는 NULLIF(EXPR1, EXPR2) 에서 EXPR1 = EXPR2 -> NULL / EXPR1 != EXPR2 -> EXPR1 으로 작동한다.
즉 두 결과 값이 같은 경우 NULL, 아닌 경우 EXPR1 으로 작용한다.
COALESCE 함수
COALESCE 함수는 인수의 숫자가 한정되어 있지 않으며, 임의의 개수 EXPR에서 NULL이 아닌 최초의 EXPR을 나타낸다. 만일 모든 EXPR이 NULL 이라면 NULL을 리턴한다.
*NULLIF, COALESCE 함수 예제는 생략한다.
'프로그래밍 > DataBase' 카테고리의 다른 글
[DataBase] 무결성(Integrity) 제약조건이란? (0) | 2018.09.05 |
---|---|
[DataBase] 조건절에 특정 컬럼 값이 NULL이면 해당 테이블 전체조회, 컬럼 값이 있으면 테이블 조건 조회 (1) | 2018.06.29 |
[DataBase] OUTER JOIN (외부조인) LEFT,RIGHT,FULL JOIN (7) | 2018.02.06 |
[DataBase] FROM 절에 사용하는 JOIN 의 형태 (0) | 2018.01.27 |
[DB] SQLPLUS로 SQL Script 실행(SQLD 실습환경) (0) | 2018.01.23 |
댓글