给字段排序时遇到的null值问题

当我们使用 order by 来为指定的字段进行排序时,如果db中该字段的值存在着null值,那么在排序时这些null值会不会参与排序呢?如果参与排序的话,又是以怎样的标准来排序?

在不同的DB中,对于null值的默认值不同。

PostgreSQL 中,null值默认最大

如果对一个学生表里的数据按照age字段进行顺序排序,如下:

select * from student order by age

如果name字段存在null值,那么这条sql的结果集就如下所示:

|id|student|age|
|1|小明|10|
|2|小红|12|
|3|小黑|null|
|4|小白|null|

因为null值默认是最大,所以在升序排列中null值的记录就会被排到最后。同样地,如果是降序排列,null值记录就会被排到最前面。

Oracle 中,null值默认最大

Oracle中同样认为null值最大,也就是说,升序排列时null值默认排在最后;降序排列时null值默认排在最前。

MySQL SQLServer 中,null值默认最小

MySQL和SQLServer则相反,null值默认是最小。当升序排列时null值默认排在最前;降序排列时null值默认排在最后。

在实际的业务中,null值参与的排序这可能会造成一些不必要的问题,有时候甚至会造成一个bug并且难以被发现。

所以,在对这些有可能存在null值的字段进行排序时需要注意使用关键字 nulls last/first

nulls last/first 的具体用法

我们可以通过 nulls last 或者 nulls first 关键字来指定这些null值的record是排在最后还是最前,如下:

select * from student order by age desc nulls last;

该语句指定了降序排列时,null值排到最后;需要注意的是,该关键字只能搭配order by来使用。一共也就四种用法:

  • order by [asc] nulls first
  • order by [asc] nulls last
  • order by desc nulls first
  • order by desc nulls last

如果想了解更多关于db中的这些null值,可以看看下边的链接:

  1. mysql 空值排序问题
  2. PostgreSQL 数据库NULL值的默认排序行为与查询、索引定义规范 - nulls first\last, asc\desc
查询结果中有 NULL ,当进行升序 排序 时, NULL 默认为“最大 ”,排在最后面。要想改变 NULL 的显示顺序,只需要在 SQL 语句后面加上 NULLS FIRST(排在前面), NULLS LAST(排在后面)。 转载自:https://blog.csdn.net/NextAction/article/details/62048536 ,它们也会相应地被升序排列或降序排列; ,并控制其排在最前面还是最后面。 排到最前面或者最后面(像 Oracle 那样),否则你就得添加一个辅助列。辅助列(只存在于查询语句里,而不存在于表中)的目的是,让你能够识别出。根据你希望的 排序 方式(以及你所使用的数据库管理系统如何处理。表的 COMM 列对查询结果进行 排序 ,但该字段可能为。这样一来,你就能在不影响非。 都放到最后面,那么你就要使用。 排序 问题 ),你能够对可能为。的列进行升序排列或者降序排列。返回的 ,你就能在不影响。 ,例如,你可能想把非。 我们可以在 排序 添加加上 is null 这个在加 排序 条件 空 就会排在后面,其他正常 排序 SELECT * FROM insure ORDER BY update_ 如 select * from tableTest order by VISITS desc 将原来的 sql 语句改写为:select * from tableTest order by VISITS desc nulls last," nulls last"控制将空 记录放在后面,当然,你... 在 排序 时,我们可能会遇到 排序 字段为 null 的情况,但是又需要该 null 数据(即不能限制该字段is not null ),而一般情况下我们都希望非 null 数据在前面。我们来看下这两种情况: 升序 排序 (默认 排序 )时, null 默认会放在最后面,当然如果我们需要 null 在前面,可以这样:ORDER BY tn_time ASC NULLS FIRST 降序时, null 默认会放在最前面,我们可以使用 ORDER BY tn_time DESC NULLS LAST 将 null 放到最后面。 参考:https://b 7 rows selected. 2.不加“关照”的order by降序 排序 效果– NULL 在前。 sec@ora10g&gt; select * from t order... 关于in和exists的使用 1.当父查询结果集小于子查询结果集则选择exists,如果父查询结果集大于子查询结果集选择in。(可尝试等价改写) in和exists都有子查询优化,提升子查询,有时候这两的执行计划一样。需要注意的是如果子查询包含了父查询里面的条件,in不会被优化。 2.in里面的 一般不超过100个 3.单表postgre sql 的in和个数关系不大,都可以走索引。 4.当有连表并且... <select id="selectScoreInfo" resultType="java.util.Map" parameterType="java.util.Map"> select DZShare.T_Y_SBBHDEVICE_SITE.* , ROUND(DZShare.T_Y_SCORE.actual_score ,2) as actual_score , ROUND(DZShare.T_Y_SCORE.total_score ... 处理方法:case语法 ...order by if(IS NULL (age),1,0); 相当于创建新列, null 时为1, 不是 null 时为0,先对新列 排序 再 对age列 排序 ,这样 null 就变成了最大 asc时, nulls last为默认 desc时, nulls first为默认 from OADocument t order by t.addtime desc nulls last