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