NULL의 디폴트 표시 위치
소트의 기준 컬럼에 NULL이 있는 경우, 디폴트 설정인 오름차순에선 NULL이 마지막에 표시되고, 내림차순에서는 가장 처음에 표시됩니다. 즉, 오름차순에서 NULL은 ‘가장 크게’ 취급되지만 ‘큰 값’으로서 취급되는 것은 아닙니다.
그러나 NULL의 표시 위치는 옵션으로 제어할 수 있습니다.
이 글의 예시는 아래 글의 초기 데이터를 사용했습니다.
NULL의 표시 위치 제어
ORDER BY구에 NULLS FIRST 또는 NULLS LAST를 지정하는 것으로 오름차순, 내림차순에 상관없이 NULL의 표시위치를 바꿀 수 있습니다.
ORDER BY 컬럼명 ASC | DESC [NULLS {FIRST | LAST}]
NULL의 표시 위치 옵션
NULLS FIRST는 NULL을 항상 선두에 표시합니다. 아래는 NULLS FIRST를 사용한 SQL문입니다. NULL데이터가 존재하는 컬럼인 comm을 소트 기준으로, NULLS FIRST 옵션을 지정했습니다.
SELECT ename, comm FROM emp
WHERE job = 'SALESMAN' OR job = 'MANAGER'
ORDER BY comm NULLS FIRST;
emp 테이블의 comm 컬럼 기준으로 소트한 결과, NULL 값이 가장 먼저 출력됩니다.
ENAME COMM
---------- ----------
JONES
BLAKE
CLARK
TURNER 0
ALLEN 300
WARD 500
MARTIN 1400
NULLS LAST는 NULL을 항상 마지막에 표시합니다. 아래는 NULLS LAST를 사용한 SQL문입니다. NULL데이터가 존재하는 컬럼인 comm을 소트 기준으로, NULLS LAST 옵션을 지정했습니다.
SELECT ename, comm FROM emp
WHERE job = 'SALESMAN' OR job = 'MANAGER'
ORDER BY comm NULLS LAST;
emp 테이블의 comm 컬럼 기준으로 소트한 결과, NULL 값이 가장 나중에 출력됩니다.
ENAME COMM
---------- ----------
TURNER 0
ALLEN 300
WARD 500
MARTIN 1400
BLAKE
CLARK
JONES
주의
ORDER BY에 복수의 컬럼을 지정할 때도 NULLS FIRST와 NULLS LAST를 사용할 수 있습니다. 하지만 데이터에 따라서는 소트가 되지 않은 것처럼 보일 수 있습니다.
comm NULLS LAST와 ename를 함께 소트 기준으로 지정한 SQL문입니다.
SELECT ename, comm FROM emp
WHERE job = 'SALESMAN' OR job = 'MANAGER'
ORDER BY comm NULLS LAST, ename;
ename 데이터는 오름차순으로도 내림차순으로도 소트되지 않은 것처럼 보이는 결과가 출력됩니다. 하지만 실제로는 comm을 우선으로 소트한 후, comm의 값이 NULL로 일치하지만 ename가 다른 데이터 BLAKE, CLARK, JONES끼리는 오름차순으로 출력된 것을 확인할 수 있습니다.
ENAME COMM
---------- ----------
TURNER 0
ALLEN 300
WARD 500
MARTIN 1400
BLAKE
CLARK
JONES