【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>
如,我们需要提取奖金最少的前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>
相关文章推荐
- SQL Server 2005的安装
- MySQL学习笔记
- mysql 函数 + 存储过程
- 问题解决 sql server 2008 评估期已过期解决办法
- 问题解决 sql server 2008 评估期已过期解决办法
- 第七课 MongoDB 特殊索引
- 第六课 MongoDB 索引
- mysql服务常用命令
- Lock wait timeout exceeded; try restarting transaction--MySQL
- 【MySql】常见问题集锦
- 第 二 十 六 天 :mysql 主 从 配 置
- MySQL 获取间隔天数
- Oracle-创建表和表的约束
- mysql_secure_installation
- Oracle 执行计划(Explain Plan) 说明
- SQL99标准
- Oracle数据库的使用
- Oracle数据库的使用
- 十步完全理解SQL
- paip.将数据导入到在英语语音数据库mysql道路解决空原则问题