SQLD/SQL 기본과 활용

SQLD) NULL 과 공집합

DevPing9_ 2020. 8. 19. 17:32

# NULL 의 특성

 - NULL 은 아직 정의 되지 않은 값. 0은 숫자이며, 공백은 문자.

 - 테이블 생성시 NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을 가질 수 있다.

 - NULL값을 포함 하는 연산의 경우 결과 값도 NULL.

 - NULL값을 비교연산(=, !=)시 FALSE 리턴. (NULL값의 비교연산은 IS NULL 이나 IS NOT NULL 로 가능)

 - NULL은 집계함수에서 연산에 사용되지않는다. (자원 사용 효율에 좋음, Skip한다고 생각하면됨)

 

# NVL(exp1, exp2) / ISNULL(exp1, exp2)             * Oracle    * SQL Server

 - exp1의 결과값이 NULL이면 exp2를 출력 (exp1과 exp2의 데이터 타입이 같아야 함)

# Oracle
SQL> SELECT NVL(NULL, 'NVL-OK') AS NVL_TEST1,
            NVL('Is it NULL?' , 'NVL-OK') AS NVL_TEST2
     FROM DUAL;
     
# SQL Server
SQL Server> SELECT ISNULL(NULL, 'NVL-OK') AS NVL_TEST1,
            	   ISNULL('Is it NULL?' , 'NVL-OK') AS NVL_TEST2
    		 FROM DUAL;
                  
# 실행결과 (같음)
NVL_TEST1       NVL_TEST2
--------        --------
NVL-OK          Is it NULL?

 

# NULLIF(exp1, exp2)                                      * 공용

 - exp1이 exp2와 같으면 NULL, 다르면 exp1 리턴

 

# Oracle & SQL Server
SQL> SELECT ENAME, MGR, NULLIF (MGR, "Boss") AS NIF FROM EMP;

     
                  
# 실행결과 (같음)

ENAME    MGR       NIF
------      -----    --------
Edward    Boss		
Boss	
Captain   Rose    Rose
Rose      Edward  Edward
Damien    Rose    Rose
Rice      Damien  Damien

 

# COALESCE(exp1,exp2, ...)                               * 공용

 - NULL이 아닌 최초의 표현식을 리턴

 - 모든 표현식이 NULL이라면 NULL 리턴

 

# 현 테이블 상황
ENAME	MGR		SAL
------       ----	-----------
Edward    Boss      3000		
Boss                     8000
Captain   Rose      4000
Rose       Edward   2000
Damien   Rose       2500
Rice       Damien    2000


# Oracle & SQL Server
SQL> SELECT ENAME, MGR, COALESCE (NULL, MGR, SAL, ENAME) AS COAL FROM EMP;
     
                  
# 실행결과 (같음)
ENAME	MGR		SAL		COAL
------	----	-----	----
Edward	Boss	3000	Boss		
Boss			8000	8000
Captain	Rose	4000	Rose
Rose	Edward	2000	Edward
Damien	Rose	2500	Rose
Rice	Damien	2000	Damien

 

# 공집합 

 - 조건에 맞는 데이터가 한 건도 없는 경우. NULL 과 다름

 - 집계함수로 처리해야함

 

### [예제 1]

SELECT MGR FROM EMP WHERE ENAME = 'Sun';
# 실행결과 (EMP테이블의 ENAME중 Sun이 없는 경우)
선택된 레코드가 없습니다.
# 실행결과 (EMP테이블의 ENAME중 Sun이 있으나, MGR값이 NULL인 경우)
MGR
---

1개 행이 선택되었습니다.



### [예제 2]

SELECT NVL (MGR, 0000) FROM EMP WHERE ENAME = 'Sun';
# 실행결과 (EMP테이블의 ENAME중 Sun이 없는 경우)
선택된 레코드가 없습니다.
# 실행결과 (EMP테이블의 ENAME중 Sun이 있으나, MGR값이 NULL인 경우)
MGR
---
0000
1개 행이 선택되었습니다.



### [예제 3] (MAX 함수는 여러인수중 하나라도 NULL이면 NULL을 반환)

SELECT MAX (MGR) FROM EMP WHERE ENAME = 'Sun';
# 실행결과 (EMP테이블의 ENAME중 Sun이 없는 경우)
MGR
---

1개 행이 선택되었습니다.
# 실행결과 (EMP테이블의 ENAME중 Sun이 있으나, MGR값이 NULL인 경우)
MGR
---

1개 행이 선택되었습니다.

 

 

728x90