【SQL】NULLS FIRST的作用

来源:互联网 发布:数据库的服务器名称 编辑:程序博客网 时间:2024/06/01 11:37

在按列排序的时候,我们常常忽略空值(null)的影响。

如,我们需要提取奖金最少的前3个员工,将其奖金增加1000,很可能开发人员是这样写的sql:

SQL> select empno,ename,comm,comm+1000 as new_comm from (select empno,ename,comm from emp order by comm asc) where rownum <= 3;


     EMPNO ENAME            COMM   NEW_COMM
---------- ---------- ---------- ----------
      7844 TURNER              0       1000
      7499 ALLEN             300       1300
      7521 WARD              500       1500


SQL>

很明显,这次奖金的调整,幸运地落地到7844和7499以及7521身上。但其实,我们看看奖金最低是他们吗?

SQL> select empno,ename,comm from emp where comm is null;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7369 SMITH
      7566 JONES
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER


已选择10行。


SQL>

我们认为这部分员工奖金还没有设置,也就是无奖金。所以这次奖金的调整应该首先惠及到他们。

那么,为什么会出现这样的结果?

其实是因为,在数据库中,排序时,null按照最大来处理(无穷大)。

SQL> select empno,ename,comm from emp order by comm asc;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7844 TURNER              0
      7499 ALLEN             300
      7521 WARD              500
      7654 MARTIN           1400
      7788 SCOTT
      7839 KING
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER
      7698 BLAKE
      7566 JONES
      7369 SMITH
      7782 CLARK


已选择14行。


SQL> select empno,ename,comm from emp order by comm desc;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7369 SMITH
      7782 CLARK
      7902 FORD
      7900 JAMES
      7876 ADAMS
      7566 JONES
      7698 BLAKE
      7934 MILLER
      7788 SCOTT
      7839 KING
      7654 MARTIN           1400
      7521 WARD              500
      7499 ALLEN             300
      7844 TURNER              0


已选择14行。


SQL>

我们可以通过 NULLS FIRST来改变:

SQL> select empno,ename,comm from emp order by comm asc NULLS FIRST;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7369 SMITH
      7782 CLARK
      7902 FORD
      7900 JAMES
      7876 ADAMS
      7566 JONES
      7698 BLAKE
      7934 MILLER
      7788 SCOTT
      7839 KING
      7844 TURNER              0
      7499 ALLEN             300
      7521 WARD              500
      7654 MARTIN           1400


已选择14行。


SQL> select empno,ename,comm from emp order by comm desc NULLS LAST;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7654 MARTIN           1400
      7521 WARD              500
      7499 ALLEN             300
      7844 TURNER              0
      7788 SCOTT
      7839 KING
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER
      7698 BLAKE
      7566 JONES
      7369 SMITH
      7782 CLARK


已选择14行。


SQL>

0 0