给字段排序时遇到的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值默认排在最前。

MySQLSQLServer中,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

SQL - nulls值排序问题的更多相关文章

  1. SQL NULL 值【摘自W3C】

    SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...

  2. SQL NULL 值

    NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...

  3. SQL-W3School-高级:SQL NULL 值

    ylbtech-SQL-W3School-高级:SQL NULL 值 1.返回顶部 1. NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS N ...

  4. Mysql 排序null值 排序问题分析

    mysql中null值的排序问题分析   如下表t_user:  name age zhangsan 1 lisi NULL wangwu 2   www.2cto.com   执行一下sql:  S ...

  5. SQL——行值表达式(Row Value Expressions)

    概述 最近接触了一个新概念——行值表达式,也叫做行值构造器.这是一个很强大的SQL功能,通常我们所操作的SQL表达式都只能针对一行中的单一字段进行操作比较,而行值表达式可以针对一行中的多个字段进行操作 ...

  6. SQL键值约束、索引使用

    添加約束的方式: [exec sp_helpconstraint 表名]->可用于查找到表创建的约束 CREATE TABLE stuInfo ( stuName ) NOT NULL,非空約束 ...

  7. SQL 语句实现排序问题!

    SQL 查询数据时按某列排序后增加排名列,需排名的列值相等时排名相同,即如需排名列数组为:9,9,8,7,7,6     添加的排名列数组需要显示为两种: 第一种:1,1,3,4,4,6 (这种排名方 ...

  8. sql语法值ORACLE简单介绍

    版权声明:本文为[博主](https://zhangkn.github.io)原创文章,未经博主同意不得转载.https://creativecommons.org/licenses/by-nc-sa ...

  9. 关于SQL中的排序问题

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

随机推荐

  1. Linux在本地使用yum安装软件(转)

    经常遇到有的linux服务器由于特殊原因,不能连接外网,但是经常需要安装一些软件,尤其是在编译一些包的时候经常由于没有安装一些依存包而报的各种各样的错误,当你找到依存的rpm包去安装的时候,又提示你有 ...

  2. [转载]saltstack master配置文件中文翻译

    原文出处:http://blog.coocla.org/301.html Salt系统的配置是令人惊讶的简单,对于salt的两个系统都有各自的配置文件,salt-master是通过一个名为master ...

  3. 简明扼要谈Spring IOC的好处

    http://a-kuei.iteye.com/blog/676524 iOC:控制反转,它是不是什么技术,它是一种设计模式.所谓控制反转就是由容器控制程序间的关系,而不是传统实现中,由编程代码直接操 ...

  4. bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示

    <table class="table table-hover" id="userTable" > <thead> <tr> ...

  5. Mac OS用minikube安装单节点kubernetes

    参考 https://kubernetes.io/docs/tasks/tools/install-minikube/ https://github.com/linianhui/code/blob/m ...

  6. fstab文件解析

    1 这个文件的用途 这个文件是启动时自动挂载指定的磁盘或者分区到系统目录下用的,提供给mount命令用. 2 文件解析 每一行是一次mount操作. 磁盘或者分区    挂载的目录     挂载的磁盘 ...

  7. Spark SQL is a Spark module for structured data processing.

    http://spark.apache.org/docs/latest/sql-programming-guide.html

  8. mongo 原理 Replica Set Oplog

    [客户的写请求全部发送至主节点] Primary. The primary receives all write operations. Secondaries. Secondaries replic ...

  9. HDU 6109 数据分割 【并查集+set】 (2017"百度之星"程序设计大赛 - 初赛(A))

    数据分割 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. Caused by: java.lang.IllegalArgumentException: Malformed \uxxxx encoding.

    application.properties中不能含有\符号.  只要遇到就会报这个错误. 解决方式:将application.properties中的 \ 改为 \\ 或者 /