본문 바로가기
Database/Oracle

[Oracle SQL] SELECT문 - null과 NVL함수, 연결 연산자, distinct

by Amy IT 2022. 5. 7.

이전 글에 이어서 SELECT문에 대해 정리해 보겠습니다.

 

 

5. null과 NVL함수

 

5-1. null(널)값

 

null(널)은 값이 없다는 것으로, 이용 불가능하며 비교 불가능한 데이터입니다. Oracle은 기본적으로 컬럼에 null값이 저장되는 것을 허용하며, 제약조건을 이용해서 null값을 허용하지 않을 수도 있습니다. null값을 이용해 검색하고 싶을 때는 IS NULL, IS NOT NULL 이라는 정해진 문구를 사용해야 합니다. 

 

SELECT comm FROM emp WHERE comm IS NULL;
SELECT comm FROM emp WHERE comm IS NOT NULL;

 

null은 값이 없으므로 연산도 불가능합니다. null값을 연산하면 자동으로 null값으로 처리됩니다.

 

SELECT comm, comm+1000 FROM emp;

 

 

5-2. NVL 함수

 

이때 null값의 존재 여부와 상관없이 연산하기 위해서는 NVL 함수를 사용해야 합니다. 

 

NVL(컬럼명, 값)

 

NVL 함수는 해당 컬럼 내 데이터가 null인 경우 특정 값으로 바꿉니다. 다음은 comm이 null인 경우 해당 값을 0으로 바꾸어 연산하는 SQL문입니다. null값을 포함해 모든 데이터가 연산된 것을 확인할 수 있습니다.

 

SELECT comm, NVL(comm,0)+1000 FROM emp;

 

 

월급에 12를 곱하고 커미션을 더한 값을 연봉이라고 정의할 때, 다음과 같은 SQL문을 만들 수 있습니다. comm이 null이어도 결과값이 나오는 것을 확인할 수 있습니다. 

 

SELECT ename "이름", sal "월급", comm "커미션", (sal*12)+NVL(comm,0) "연봉" FROM emp;

 

 

5-3. NVL2 함수

 

NVL2 함수를 사용할 수도 있습니다. 

 

NVL2(컬럼명, A, B)

 

해당 컬럼 내 데이터가 null이 아닌 경우 A, null인 경우 B로 바꿔주는 함수입니다. null이 아닌 경우가 A에 온다는 점이 헷갈릴 수 있어 주의해야 합니다. 다음과 같이 NVL2 함수를 이용하여 mgr 컬럼의 값이 null이 아닌 경우 '관리자 있음', null인 경우 '관리자 없음'으로 나타내는 명령을 실행할 수 있습니다. 

 

SELECT mgr, NVL2(mgr,'관리자 있음','관리자 없음') "관리자 유무" FROM emp;

 

 

null의 존재 유무에 따라 내용이 달라지는 것을 확인할 수 있습니다. 

 

 

 

6. 연결 연산자 

 

연결 연산자(||)를 사용하면 여러 개의 문자열을 연결하여 하나의 문자열로 생성할 수 있습니다. '||' 이 기호는 enter 위에 있는 '\'를 shift와 함께 눌러 두 번 입력한 것입니다. 다음과 같이 사용 가능합니다.

 

SELECT ename||'사원' "사원명" FROM emp;

 

 

공백을 포함해 여러 개의 문자열 혹은 컬럼을 이어 붙일 수도 있습니다.

 

SELECT job||' '||ename FROM emp;

 

 

SELECT ename||'의 직업은 '||job||'이다.' FROM emp;

 

 

 

 

7. DISTINCT

 

DISTINCT를 이용하면 해당 컬럼 내 중복되는 행을 제거하여 출력할 수 있습니다. 

 

SELECT DISTINCT 컬럼명 FROM emp;
SELECT DISTINCT job FROM emp;

 

DISTINCT 키워드 없이 실행했을 때와 다르게 레코드가 5개만 출력되는 것을 확인할 수 있습니다. 

 

 

DISTINCT 키워드 뒤에 여러 개의 컬럼을 설정하면 컬럼의 조합들이 중복되지 않게 출력됩니다. 여기서는 30번 부서의 SALESMAN이 중복되어 제거되고 한 개만 출력되었습니다. 

 

SELECT DISTINCT job, deptno FROM emp;

 

 

 

지금까지 SELECT문에서 테이블의 데이터를 검색, 출력하는 기본적인 방법을 알아보았습니다. 다음 글에서는 SELECT문에서 특정 조건에 일치하는 데이터를 조회할 수 있는 방법에 대해 알아보도록 하겠습니다. 

 

 

댓글