您的位置:首页 > 数据库

【SQL】NULLS FIRST的作用

2015-10-10 21:12 375 查看
在按列排序的时候,我们常常忽略空值(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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: