null값이 포함된 데이터가 선두에 출력 되지 않는 이유

스폰서 링크
Oracle DB
스폰서 링크
스폰서 링크

문제 발생 내용

SQL문으로 특정 항목을 정렬하여 출력하고 싶을 때 null값이 최대 값으로 정렬 되는지 최소 값으로 정렬 되는지 헷갈릴 경우가 있습니다. 이 글을 통해 확실한 지식을 가지고 null값을 제어 할 수 있도록 정리 해 보았습니다.

null값의 출력 순서 지정

【null값이 가장 먼저 출력되도록 하고 싶은 경우】

오라클 데이터베이스는 null값을 무한대(최대값)로 정의하기 때문에 ORDER BY 컬럼명 DESC 구문을 지정하면 null 값을 포함한 데이터는 가장 처음에 출력 됩니다.

예)SELECT * FROM 테이블명 ORDER BY 컬럼명 DESC;

SQL문 실행 결과는 set NULL ‘[NULL]’설정으로 NULL값을 [NULL]문자로 표시하도록 했습니다.

C:\>sqlplus scott/tiger@192.168.127.128/orcl
SQL> set NULL '[NULL]'

다음은 예문을 위한 샘플 테이블을 작성합니다.

  DROP TABLE test_null_sort;
  CREATE TABLE test_null_sort (
   itemid   NUMBER not null,
   item1    VARCHAR2(10)
  );
  INSERT INTO test_null_sort VALUES(8, 'testB');
  INSERT INTO test_null_sort VALUES(9, 'test10');
  INSERT INTO test_null_sort VALUES(3, 'test3');
  INSERT INTO test_null_sort VALUES(5, 'test5');
  INSERT INTO test_null_sort VALUES(7, null);
  INSERT INTO test_null_sort VALUES(1, 'testZ');
  INSERT INTO test_null_sort VALUES(2, null);
  INSERT INTO test_null_sort VALUES(4, 'test4');
  INSERT INTO test_null_sort VALUES(6, 'test');
  COMMIT;

다음은 SQL문 예문입니다.

SQL> set NULL '[NULL]'
SQL> SELECT item1 FROM test_null_sort ORDER BY item1 DESC;
 ITEM1
----------
 [NULL]
 [NULL]
 testZ
 testB
 test5
 test4
 test3
 test10
 test
 9 rows selected.
SQL>

다른예)
SELECT * FROM 테이블명 ORDER BY 컬럼명 NULLS FIRST;
SELECT * FROM 테이블명 ORDER BY 컬럼명 ASC NULLS FIRST;

【null값이 가장 마지막에 출력되도록 하고 싶은 경우】

오라클 데이터베이스는 null값을 무한대(최대값)로 정의하기 때문에 ORDER BY 컬럼명 ASC 구문을 지정하면 null 값을 포함한 데이터는 가장 마지막에 출력 됩니다. ASC를 지정하지 않으면 디폴트 ASC로 인식해 같은 결과가 출력 됩니다.

예)SELECT * FROM 테이블명 ORDER BY 컬럼명 ASC;
SELECT * FROM 테이블명 ORDER BY 컬럼명;

SQL> set NULL '[NULL]'
SQL> SELECT item1 FROM test_null_sort ORDER BY item1 ASC;
 ITEM1
----------
 test
 test10
 test3
 test4
 test5
 testB
 testZ
 [NULL]
 [NULL]
 9 rows selected.
SQL>

다른예)
SELECT * FROM 테이블명 ORDER BY 컬럼명 NULLS LAST;
SELECT * FROM 테이블명 ORDER BY 컬럼명 DESC NULLS LAST;

※해당 컬럼에 null 데이터가 없는 경우, 다른 컬럼에 존재하는 null값에는 영향을 끼치지 않습니다.

ORDER BY구문을 지정하지 않은 경우 null값의 출력 순서

데이터가 등록/갱신/삭제로 인해 무질서한 상태로 저장되어 있는 그대로 를 출력 한다고 생각하면 됩니다.
결론은 순서 없이 출력 되는 게 정답입니다.

SQL> set NULL '[NULL]'
SQL> SELECT item1 FROM test_null_sort;
 ITEM1
----------
 testB
 test10
 test3
 test5
 [NULL]
 testZ
 [NULL]
 test4
 test
 9 rows selected.
SQL>
제목과 URL을 복사했습니다