[SQL] IS NULL and IS NOT NULL 그리고 NVL and NVL2
안녕하세요. 이번 글은 IS NULL and IS NOT NULL 그리고 NVL and NVL2에 대한 설명입니다.
- IS NULL, IS NOT NULL
- [칼럼명] IS NULL : 칼럼명에 대한 값이 비어있는 튜플을 조회하는 연산자
- [칼럼명] IS NOT NULL : 칼럼명에 대한 값이 비어있지 않은 튜플을 조회하는 연산자
NULL이란 비어있는 값을 의미하며 절대 0이랑 같은 선에서 혼동하지 않도록 해야한다. 숫자 0은 0이라는 값이 존재하기 때문이다. NULL값은 데이터를 입력할 때 해당 란에 어떠한 값도 입력하지 않고 공백으로 뒀다는 것을 명심해야 한다.
다음은 EMP 테이블의 전체 데이터를 출력한 결과이다. 여기서 MGR과 COMM 부분에서 (null)이라고 적혀있는 부분이 보일 것이다. 이 부분은 처음 데이터를 입력할 때 어떠한 값도 입력하지 않았다는 표시이다. 그러므로 해당 부분은 빈 값이라고 볼 수 있다. 그리고 우리는 where 뒤에 붙는 컬럼명과 IS NULL과 IS NOT NULL을 사용하여 빈 값이 있는 혹은 없는 부분을 필터링해서 조회할 수 있다. 해당 이미지를 보여주는 이유는 NULL 관련 함수 사용 전후를 비교하기 위해서이다.
select * from EMP where COMM is NULL;
다음은 EMP 테이블 내 COMM이라는 칼럼에 대해서 값이 존재하지 않는 전체 행을 출력하라는 코드와 결과물이다.
IS NULL을 사용하여 COMM 칼럼에 빈값이 있는 부분만 필터링해서 결과가 나온다는 점을 확인할 수 있다. 당장 이미지만 보더라도 COMM 부분은 모두 null이지 않은가? IS NULL은 프로그래밍 언어로 치면 == null 내지 .equals(null)이라고 볼 수도 있다.
select * from EMP where MGR is NULL;
같은 테이블 내 MGR에 대한 빈 값을 조회하면 다음과 같이 올바르게 출력되는 것 또한 확인할 수 있다.
select * from EMP where COMM is NOT NULL;
다음은 NOT NULL 연산자이다. IS NULL과 대조되며 특정 컬럼에 대한 데이터가 빈 값이 아닌 행만 출력하는 역할을 담당한다. 상단 코드는 EMP 테이블 내 COMM 이라는 컬럼에 대한 값이 빈 값이 아닌 모든 관련된 행에 대한 데이터를 출력하라는 뜻이다. 해당 명령어를 실행하면 COMM에 대한 값이 빈 값이 아닌 데이터만 출력되는 점을 확인할 수 있다. 프로그래밍 언어 관점에서 보면 != null 내지 !String.equals(null)과 같다고 볼 수 있다.
select * from EMP where MGR is NOT NULL;
MGR에 대한 NOT NULL 또한 다음과 같이 MGR이 빈 값이 아닌 행만 출력되는 점을 확인할 수 있다.
- NVL, NVL2
- NVL([컬럼명], 출력값) : 컬럼명에 대한 데이터가 NULL이면 출력값을 표시하는 함수
- NVL2([컬럼명], NULL이 아닐 때 출력값, NULL일때 출력값) : 컬럼명에 대한 데이터가 NULL이 아니면 아닌 것에 대한 출력값을 표시하고 NULL이면 NULL이라는 것에 대한 값을 표시하는 함수
이들은 IS NULL, IS NOT NULL 연산자를 기반으로 작동하는 확장된 함수라고 생각하면 된다. 무작정 필터링하기 보다는 전체적으로 보여주는 방식을 기반으로 빈 값인 경우에 한해서 특정 표시가 출력되도록 유도하는 함수이다.
select ENAME, NVL(MGR, 0) as "NVL_EXAMPLE" from EMP;
다음 코드는 EMP 테이블에서 NVL함수를 사용해서 MGR 칼럼에 대한 데이터가 빈 값인 행에는 0을 출력될 수 있도록 하라는 뜻이다. (물론 단순한 출력인 만큼 데이터가 변경되거나 삭제되는 일은 없다.) 최상단에 보여준 EMP 테이블에 대한 전체 데이터와 비교해서 보면 KING이라는 사원에 대한 MGR이 null값으로 되어있는 곳이 0으로 표시된 점을 확인할 수 있다.
select ENAME, NVL2(COMM, 'OK', 0) as "NVL2_SAMPLE" from EMP;
다음 코드는 EMP 테이블에서 NVL2함수를 사용해서 COMM 칼럼에 대한 데이터가 빈 값이 아니면 'OK'라는 값을 표시하고 반대로 빈 값이면 0이라는 값을 표시하라는 뜻이다. 최상단 전체 데이터와 비교해서 보면 실제 OK라는 부분은 전체 데이터에서는 빈 값이 아닌 점과 0이라는 부분은 (null)이라고 출력되는 점을 확인할 수 있다.
다음 글은 와일드카드(Wildcard)에 대한 설명입니다.