我们都知道在Oracle SQL语句中命令是用来排序查询出来的结果集的,而在Oracle中NULL值是一个很特殊的值,如果order by指定的列有NULL值,那排序结果又是怎样的呢。
下面做一组实验观察一下命令时甲骨文是怎么处理零的
版本11.2.0.4
1,创建测试表并插入测试数据
zx@ORCL> create table t (id 数字,name varchar2 (10)); Table 创建。 zx@ORCL> insert  into t 值(1、zx); 1,row 创建。 zx@ORCL> insert  into t 值(2,“王”); 1,row 创建。 zx@ORCL> insert  into t 值(3 ' zxt '); 1,row 创建。 zx@ORCL> insert  into t 值(空); 1,row 创建。 zx@ORCL> insert  into t 值(5 ' yhz '); 1,row 创建。 zx@ORCL> insert  into t 值(空); 1,row 创建。 zx@ORCL>提交; Commit 完成。 zx@ORCL> select *,得到t; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1,zx 2,西城 ,3 zxt ,4 ,5 yhz ,6 6,rows 选中。
2,测试按
zx@ORCL> select *,得到t order by name asc; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2,西城 ,5 yhz 1,zx ,3 zxt ,6 ,4 6,rows 选中。 zx@ORCL> select *,得到t order by name desc; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,4 ,6 ,3 zxt 1,zx ,5 yhz 2,西城 6,rows 选择。
看到不同的排序方式,NULL值所排序的位置不同。升序(asc)零排在最后,降序(desc)零排在最前。
我们再来看看官方文档是怎么描述的
指定排序顺序(升序或降序)只<代码dir=" ltr "> asc> 代码,是默认的。
指定是否返回行包含null应该出现第一个或最后一个命令序列。
<代码dir=" ltr "> null 代码>,<代码dir=" ltr "> 代码>,最后是默认为升序,以及<代码dir=" ltr "> null 代码>,<代码dir=" ltr ">第一次> 代码,是默认为降序排列。
可以看到我们的实验结果与官方文档描述是一致的,而且还可以使用NULL姓| NULL来决定零的值是排在最前还是排在最后。
3,再次做实验验证
zx@ORCL> select *,得到t order by name asc nulls ; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,6 ,4 2,西城 ,5 yhz 1,zx ,3 zxt 6,rows 选中。 zx@ORCL> select *,得到t order by name asc nulls 去年; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2,西城 ,5 yhz 1,zx ,3 zxt ,6 ,4 6,rows 选中。 zx@ORCL> select *,得到t order by name desc nulls ; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,4 ,6 ,3 zxt 1,zx ,5 yhz 2,西城 6,rows 选中。 zx@ORCL> select *,得到t order by name desc nulls 去年; ID 名字 - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,3 zxt 1,zx ,5 yhz 2,西城 ,6 ,4 6,rows 选中。
从结果可以看出使用NULL姓| NULL可以直接控制空值在排序结果的首部还是尾部。